2015-03-01 8 views
6

में वेरिएबल सेट करना मैं वेरिएबल सेट करने का प्रयास करता हूं जो ifconfig से इंटरफ़ेस आईपी-एड्रेस प्राप्त करता है और इसे बाद में पढ़ता है। लेकिन जब मैं echo कमांड निष्पादित करता हूं, तो वैरिएबल अभी भी खाली है। एक ही कमांड के साथbash -c

/usr/bin/bash -c "HOST_IPS=$(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet/&& cnt==1) {print $2} cnt++}'); echo $HOST_IPS" 

लेकिन/bin/गूंज काम ठीक: कृपया मेरे कोड को देखो

/usr/bin/bash -c "echo $(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet/&& cnt==1) {print $2} cnt++}')" 
+0

1. आप कहां '/ bin/echo' देखते हैं? 2. चूंकि आपके बाहरी उद्धरण डबल कोट्स हैं, इसलिए आपको _all_ '' 'के अंदर संकेतों से बचने की आवश्यकता है। –

उत्तर

6

आपके पास:

/usr/bin/bash -c sub=1; echo $sub 

आप मूल्य के परिवहन के लिए एक subshell में एक चर, उपयोग stdout सेट करना चाहते हैं पहले subshell पैदा की है अंतिम गूंज आदेश या वैरिएबल $HOST_IPS में $ संकेत से बचने के लिए कमांड स्ट्रिंग में प्रतिस्थापित किया जाएगा:

/usr/bin/bash -c "HOST_IPS=$(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet/&& cnt==1) {print $2} cnt++}'); echo \$HOST_IPS" 

और तत्काल दृश्यता के लिए: @ gniourf_gniourf की टिप्पणी करने के लिए

#             v-- insert backslash here 
/usr/bin/bash -c "HOST_IPS=$(same as before); echo \$HOST_IPS" 

विपरीत, यह नहीं वास्तव में आवश्यक अन्य डॉलर चिह्न से बचने के लिए है। हालांकि, लिखित के रूप में, कमांड प्रतिस्थापन सबहेल (!) द्वारा नहीं किया जाता है; इसका परिणाम कमांड स्ट्रिंग में प्रतिस्थापित किया जाता है जो सबहेल को पास किया जाता है। कॉल

mypid() { echo $$; } 
bash -c "pid=$(mypid); echo \$pid; mypid" 

तरह से यह काम करता है का प्रदर्शन: यह एक बार माता पिता खोल के पीआईडी ​​प्रिंट होगा और एक बार शिकायत करते हैं कि mypid एक ज्ञात आदेश क्योंकि subshell समारोह पता नहीं है नहीं है।

पैरेंट खोल में ifconfig | awk कमांड चलाने के बाद समस्या होने की संभावना नहीं है, तो आप शायद कमांड प्रतिस्थापन भाग अपरिवर्तित छोड़ सकते हैं। यदि यह महत्वपूर्ण है कि कमांड द्वारा कमांड चलाया जाए, तो आपको वहां भी सभी चीजों से बचना होगा।

+0

धन्यवाद! यह काम करता हैं! – d0xin

+0

@ विंटरम्यूट आप/proc/self के बारे में गलत हैं। [लिंक] (https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Reference_Guide/s1-proc-directories.html) – nawK

+0

ओह, दाएं - रीडलिंक अपनी प्रक्रिया को बढ़ाता है। हम्म ... फिर प्रदर्शन कैसे करें? मुझे एक पल दे। – Wintermute

0

/usr/bin/bash के साथ आप एक subshell शुरू करते हैं। जब खोल समाप्त हो जाता है, तो खोल में सभी सेटिंग्स खो जाती हैं।
निम्नलिखित उप subshell में स्थापित किया जाएगा और गूँजती किए जाने से पहले खो दिया:

sub=$(/usr/bin/bash -c "echo 1"); echo $sub 
0

आपके प्रश्न और उदाहरण से, आपके काम पर आपको अपने वर्तमान माहौल को छोड़ने की आवश्यकता नहीं है, इसलिए आपको एक नया शुरू करने और खोए गए डेटा से चिंतित होने की आवश्यकता नहीं है।

HOST_IPS=(); 
while read -r; 
    do [[ $REPLY =~ "inet "([^/]*) ]] && HOST_IPS+=(${BASH_REMATCH[1]}); 
done < <(ip -f inet address show) 

आप इंटरफ़ेस आईपी पतों की एक सूची बनाए रखने के लिए आप awk बुला के बिना अपने वर्तमान खोल में ip (या ifconfig) के उत्पादन की प्रक्रिया कर सकते हैं चाहते हैं।

 संबंधित मुद्दे