इनलाइन शेल-स्क्रिप्ट में चर कैसे भेजें?


26

मैं निम्नलिखित स्क्रिप्ट चलाता हूं:

VAR="Test"
sh -c 'echo "Hello $VAR"'

लेकिन मुझे मिलता है:

# ./test.sh
Hello

मैं VARअपनी स्क्रिप्ट के चर को शेल के साथ कैसे बना सकता हूं sh -c '...'?

जवाबों:


44

या तो exportइसे एक पर्यावरण चर में बदलने के लिए उपयोग करें, या इसे सीधे कमांड में पास करें।

VAR="Test" sh -c 'echo "Hello $VAR"'

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'

शेल कोड के आसपास दोहरे उद्धरण चिह्नों का उपयोग करने से बचें ताकि प्रक्षेप की अनुमति दी जा सके जैसे कि कमांड इंजेक्शन कमजोरियों का परिचय:

sh -c "इको 'हैलो $ VAR'

अगर $VARकुछ कहा जाता है, तो रिबूट का कारण बनता है';reboot #


वास्तव में व्यावहारिक नहीं है (मेरे पास कई चर हैं, और मैं उन्हें पर्यावरण चर नहीं बनना चाहता), लेकिन यह काम करता है, धन्यवाद!
Matthieu Napoli

3
@ मैथ्यू: वे केवल आपकी प्रक्रिया के बच्चों के लिए पर्यावरण चर के रूप में सेट होते हैं , अगर यह आपको चिंतित करता है।
पिस्कवर

5
सिर्फ FYI करें, आप भी कर सकते हैं export var="Test" एक पंक्ति में ।
14:60 बजे user606723

@Piskvor अच्छी तरह से शुद्धि के लिए धन्यवाद, यह एकदम सही है।
Matthieu Napoli

9

यहां चर को पास करने का एक और तरीका है sh -c(स्थितिगत तर्कों के रूप में):

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}

1
(+1) स्क्रिप्ट चर के लिए सामान्य $ 1 $ 2 अपेक्षा के अनुरूप इसे अधिक रखने के लिए, इसका डमी मूल्य $ 0 हो सकता है। यह $@उम्मीद के अनुसार काम करने की अनुमति देगा , जैसे। sh -c 'echo "Hello $@"' _ "$VAR" "$VAR2"`
पीटर.ऑक्ट

2
@ पीटर। "_" का उपयोग करने के बजाय, मैं उस कमांड को देने के लिए "श" या एक समझदार नाम का उपयोग करूंगा , क्योंकि यह $0शेल द्वारा त्रुटि / चेतावनी संदेशों में प्रदर्शित होता है।
स्टीफन चेज़लस

5

यदि आप उन्हें पर्यावरण चर के रूप में निर्यात नहीं करना चाहते हैं, तो यहां एक चाल है जो आप कर सकते हैं। एक फ़ाइल में अपनी वैरिएबल परिभाषा को सहेजें .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 '...'
Kusalananda

ध्यान दें कि यदि .var_init.shवर्तमान निर्देशिका में (जैसा कि विरोध किया गया है $PATH) के लिए देखा जाना अपेक्षित है , तो यह लिखा जाना चाहिए. ./var_init.sh
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.