無法從 $! 捕獲進程 ID在 bash 3.2.57 中

無法從 $! 捕獲進程 ID在 bash 3.2.57 中

在裝有 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 中工作。

相關內容