在裝有 bash 4.2.46 的遠端伺服器上,我可以執行以下操作:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
[3] 7646
7646
但是,在我的 bash 3.2.57 的 Mac 上,它不起作用:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
-bash: !: event not found
到底是怎麼回事?不知何故,我已經使用 macOSbash
多年了,以前從未遇到過這個問題......但我發誓我已經運行了大量的 shell 程序,它們執行這種精確的$!
方法來獲取後台進程的進程ID ,並且從未讓它中斷過。
答案1
這!
是觸發字符歷史擴展,預設在互動式 shell 中啟用。
我認為它不會在pid=$!;
您的情況下或在echo "$!"
.正如您從錯誤訊息中看到的,它嘗試使用空字串來搜索,而不是像!foo
查找foo
.較新版本的 Bash 在這方面更明智,$!
或者"!"
不會觸發它,但 3.2 在這方面有點愚蠢。
似乎有效的是pid=$! ;
,分號前有空格。或者您可以使用 停用歷史記錄擴充功能set +H
。 (注意"$!"
不在 3.2 中工作。