2016-11-23 47 views
0

我在使用bash -c時將PID保存到變量中時遇到問題。例如:如何將PID保存到bash -c中的變量?

bash -c "PID=$$; echo $PID" 

在這種情況下,輸出爲空。如何在變量中保存現在變量中的子PID(變量內的命令的PID)PID

+0

你說的是哪PID?你當前正在運行的bash shell的PID,或者你正在啓動的shell? – hetepeperfan

+0

@hetepeperfan雙引號內的子命令的PID。 – 1072

+0

你能否在你的問題中明確說明,以便將來的讀者,充分利用你的問題 – hetepeperfan

回答

1

set -x對調試有用,會告訴你,到頭來前綴+實際的命令:

$ set -x 
$ bash -c "PID=$$; echo $PID" 
+ bash -c 'PID=1900; echo ' 

事實上,在該命令中,您會期望空輸出。發生這種情況是因爲$$$PID被替換爲之前bash被調用。

爲了避免這種情況,你可以單引號的字符串或難逃「$」符號:

$ set -x 
$ bash -c 'PID=$$; echo $PID' 
+ bash -c 'PID=$$; echo $PID' 
1925 
$ bash -c "PID=\$\$; echo \$PID" 
+ bash -c 'PID=$$; echo $PID' 
1929 
+0

感謝與'set -x'的提示 – 1072

2

只是使用簡單的引號,或者表達式在當前命令行中(太快)而不是在子bash中命令,PID還沒有在這個時刻定義,你實際上是通過

bash -c "PID=4353; echo" 

(其中4353是當前bash進程的PID)

有人指出,目前還不清楚,如果你想通過家長pid或孩子pid

通過父PID,解決這個問題是這樣的(只有雙引號內的部分評估之前調用bash的子進程):

bash -c "PID=$$; "'echo $PID' 

通過孩子PID,解決它像這樣(沒有進行評估在當前shell,用於awk腳本)同樣的伎倆:

bash -c 'PID=$$; echo $PID' 
+1

OP是否應該採用父bash shell的PID還是新啓動的bash shell有點不清楚。 +1表示兩種選擇! – hetepeperfan

+0

什麼時候我必須在child-command中使用簡單的引號? – 1072

+0

@hetepeperfan再次XY問題!我在答案中增加了兩種可能性。也許「通過父母」是最有用的。沒有必要將自己的進程ID傳遞給子進程。 –

相關問題