2015-03-01 22 views
6

ifconfig'dan arabirim ip adresi alan ve daha sonra okuyacağım değişkenleri ayarlamaya çalışıyorum. Ama ben bir echo komutunu çalıştırdığımda, değişken hala boş. Benim kod bakmak edin:Bash -c'de ayar değişkeni

/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" 

Fakat/bin/eko çalışma cezası aynı komutuyla: /usr/bin/bash ile

/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'yu nerede görüyorsunuz? 2. Dış tırnaklarınız çift tırnak olduğundan, _all_ '$' içindeki işaretlerden kaçmanız gerekir. –

cevap

6

:

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

size değer taşınması için bir kabuktaki bir değişken, kullanım stdout'u ayarlamak ister misiniz altkabuk kökenli önceki son yankı komutu veya değişken $HOST_IPS yılında $ işareti kaçmak için komut dizesine ikame edilecektir:

/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" 
Daha acil görünürlüğü için

: @ gniourf_gniourf yorumuna

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

aksine, diğer dolar işaretleri kaçmak için aslında gerekli değildir. Ancak, yazılı olarak, komut ikamesi alt kabuk (!) Tarafından gerçekleştirilmez; sonucu, alt kabuğa geçirilen komut dizesiyle değiştirilir. çağrılar

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

çalışma şeklini göstermektedir: bir zamanlar üst kabuğun PID yazdırmak ve bir kez altkabuk işlevini bilmediği için mypid bilinen bir komut olmadığını şikayet edecektir.

Ana kabukta ifconfig | awk komutunu çalıştırmanın bir sorun olması beklenmediğinden, muhtemelen komut değiştirme bölümünü değiştirmeden bırakabilirsiniz. Komutun subshell tarafından çalıştırılması önemliyse, oradaki her şeyden de kaçmak zorunda kalacaksınız.

+0

Teşekkürler! işe yarıyor! – d0xin

+0

@Wintermute/proc/self hakkında yanılıyorsunuz. [bağlantı] (https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Reference_Guide/s1-proc-directories.html) – nawK

+0

Oh, sağ - readlink kendi sürecini oluşturur. Hmm ... nasıl gösterilecek, o zaman? Bana bir dakika ver. – Wintermute

0

Bir altkabuk başlar. Kabuk tamamlandığında, kabuktaki tüm ayarlar kaybolur.
aşağıdaki alt yankılandı önce alt kabukta kurmak ve kaybolur: You have

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

Sorunuzdan ve örneğinizden, göreviniz mevcut ortamınızı terk etmenizi gerektirmiyor, dolayısıyla yeni bir tane başlatmanıza ve verilerin kaybolmasıyla ilgilenmenize gerek kalmıyor.

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

Eğer awk uğramadan mevcut kabuğunda ip (veya ifconfig) çıktısını işleyebilir arayüz IP adreslerinin bir listesini tutmak istiyorsanız.