我需要獲取命令的完整輸出並獲取其pid。問題是,得到的pid是這樣的:Bash - 如何將命令的輸出寫入變量並獲取命令pid
(nmcli d wifi connect "$1" password "$2") & PID=$!
,並搶得的輸出是這樣的:
output="$(nmcli d wifi connect $1 password $2)"
如何結合這兩種?
我需要獲取命令的完整輸出並獲取其pid。問題是,得到的pid是這樣的:Bash - 如何將命令的輸出寫入變量並獲取命令pid
(nmcli d wifi connect "$1" password "$2") & PID=$!
,並搶得的輸出是這樣的:
output="$(nmcli d wifi connect $1 password $2)"
如何結合這兩種?
我認爲最好的方法是使用臨時文件:
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 - 也很少遇到腳本太多引述 )。
你的意思是這樣的嗎?
#/bin/env bash
nmcli d wifi connect "$1" password "$2" > /tmp/$$.tmp &
PID=$!
wait
output=$(</tmp/$$.tmp)
...
是的,但這是不可能的,沒有寫入一個tmp文件? –
@RichiBurkhardt:我不這麼認爲。至少,我不知道如何。 – Atafar
這是無法完成的。您想要在後臺運行程序並將其輸出同時捕獲到變量中。如果可能的話,那麼在執行後臺程序期間變量的值將會改變,而不需要你明確的命令。例如:
output="$(nmcli d wifi connect $1 password $2)" &
echo $output #maybe empty
sleep 10
echo $output #what now?
在上面的腳本中,我們沒有顯式地(通過賦值)更改「output」變量的值。但是,如果你所問的功能是可能的,那麼變量的值將會隱含地改變(這是容易出錯的)。
您可以通過將背景命令的輸出重定向到文件來實現相同的功能。
我實際上有「異步」邏輯runnung。只捕捉錯誤是不可能的。 –
一旦捕獲輸出,我看不出PID是如何使用的,因爲子進程在那個點上不再存在。 –