2015-06-05 181 views
1

我需要獲取命令的完整輸出並獲取其pid。問題是,得到的pid是這樣的:Bash - 如何將命令的輸出寫入變量並獲取命令pid

(nmcli d wifi connect "$1" password "$2") & PID=$! 

,並搶得的輸出是這樣的:

output="$(nmcli d wifi connect $1 password $2)" 

如何結合這兩種?

+3

一旦捕獲輸出,我看不出PID是如何使用的,因爲子進程在那個點上不再存在。 –

回答

4

我認爲最好的方法是使用臨時文件:

f="${TMPDIR:-/tmp}/tmp.$$" 
trap "rm $f" EXIT 
nmcli d wifi connect "$1" password "$2" >"$f" & 
nm_pid=$! 

# ... do stuff 

wait $nm_pid 
# ... use contents of "$f" 

(我周圍加引號的$ 1和$ 2 - 也很少遇到腳本太多引述 )。

0

你的意思是這樣的嗎?

#/bin/env bash 
nmcli d wifi connect "$1" password "$2" > /tmp/$$.tmp & 
PID=$! 
wait 
output=$(</tmp/$$.tmp) 
... 
+0

是的,但這是不可能的,沒有寫入一個tmp文件? –

+0

@RichiBurkhardt:我不這麼認爲。至少,我不知道如何。 – Atafar

0

這是無法完成的。您想要在後臺運行程序並將其輸出同時捕獲到變量中。如果可能的話,那麼在執行後臺程序期間變量的值將會改變,而不需要你明確的命令。例如:

output="$(nmcli d wifi connect $1 password $2)" & 
echo $output #maybe empty 
sleep 10 
echo $output #what now? 

在上面的腳本中,我們沒有顯式地(通過賦值)更改「output」變量的值。但是,如果你所問的功能是可能的,那麼變量的值將會隱含地改變(這是容易出錯的)。

您可以通過將背景命令的輸出重定向到文件來實現相同的功能。

+0

我實際上有「異步」邏輯runnung。只捕捉錯誤是不可能的。 –

相關問題