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