मैं निम्नलिखित स्क्रिप्ट चलाता हूं:
VAR="Test"
sh -c 'echo "Hello $VAR"'
लेकिन मुझे मिलता है:
# ./test.sh
Hello
मैं VAR
अपनी स्क्रिप्ट के चर को शेल के साथ कैसे बना सकता हूं sh -c '...'
?
मैं निम्नलिखित स्क्रिप्ट चलाता हूं:
VAR="Test"
sh -c 'echo "Hello $VAR"'
लेकिन मुझे मिलता है:
# ./test.sh
Hello
मैं VAR
अपनी स्क्रिप्ट के चर को शेल के साथ कैसे बना सकता हूं sh -c '...'
?
जवाबों:
या तो export
इसे एक पर्यावरण चर में बदलने के लिए उपयोग करें, या इसे सीधे कमांड में पास करें।
VAR="Test" sh -c 'echo "Hello $VAR"'
VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'
शेल कोड के आसपास दोहरे उद्धरण चिह्नों का उपयोग करने से बचें ताकि प्रक्षेप की अनुमति दी जा सके जैसे कि कमांड इंजेक्शन कमजोरियों का परिचय:
sh -c "इको 'हैलो $ VAR'
अगर $VAR
कुछ कहा जाता है, तो रिबूट का कारण बनता है';reboot #
export var="Test"
एक पंक्ति में ।
यहां चर को पास करने का एक और तरीका है sh -c
(स्थितिगत तर्कों के रूप में):
{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
$@
उम्मीद के अनुसार काम करने की अनुमति देगा , जैसे। sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"
`
$0
शेल द्वारा त्रुटि / चेतावनी संदेशों में प्रदर्शित होता है।
यदि आप उन्हें पर्यावरण चर के रूप में निर्यात नहीं करना चाहते हैं, तो यहां एक चाल है जो आप कर सकते हैं। एक फ़ाइल में अपनी वैरिएबल परिभाषा को सहेजें .var_init.sh
और इसे अपने उप-शेल में इस तरह से स्रोत करें:
.var_init.sh
VAR="Test"
कमांड लाइन से:
sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'
इस तरह, आप केवल अपने सब-वे के निष्पादन पर अपने चर निर्धारित करते हैं।
ENV=.var_ini.sh sh -c '...'
.var_init.sh
वर्तमान निर्देशिका में (जैसा कि विरोध किया गया है $PATH
) के लिए देखा जाना अपेक्षित है , तो यह लिखा जाना चाहिए. ./var_init.sh