2014-02-26 49 views
0

我試圖讓我的本地IP與ifconfig並將其寫入文件,但由於某種原因未能這樣做。Bash grep本地IP地址並寫入到makefile中的文件?

run: 
    LOCALIP=$(shell ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | awk '{print $1}') & 
    echo "var LOCAL_IP = '${LOCALIP}'" > local_ip.js & 

它得到正確的IP,但由於某些原因無法寫入到文件和文件僅包含var LOCAL_IP = ''

誰能幫助我,告訴我在做什麼錯?

+0

請勿在後臺運行這些命令。 'LOCALIP'被設置在一個子shell中,所以沒有在寫入'local_ip.js'的shell中分配。 – chepner

+0

你能提供預期的產出嗎? – csiu

+0

@chepner你可以修復我的代碼 - 不要在子shell中運行嗎? –

回答

2

兩個問題:一,在一個Makefile配方中爲每個單獨的命令在一個單獨的shell執行,所以你需要「合併」他們。二,你需要將echo中的$加倍,以便將它發送到shell,而不是由make首先擴展。這應該工作:

run: 
     LOCALIP=$(shell ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | awk '{print $1}'); \ 
     echo "var LOCAL_IP = '$${LOCALIP}'" > local_ip.js 

分號和續行反斜槓確保整個配方在同一個shell執行,因此在運行時echoLOCALIP仍設置。您可以通過直接在參數echo中嵌入命令替換來「簡化」此操作。

run: 
     echo "var LOCAL_IP = '$(shell ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | awk '{print $1}')'" > local_ip.js 
0

這AWK可以工作:

ifconfig | awk -F: '/inet addr/&& !($2 ~ /127\.0\.0\.1/){gsub(/ .*/, "", $2); print $2}' 
+0

這不是ip不工作,它寫入文件 –

+0

你可以添加'> output.log'來存儲它的輸出。 – anubhava