无法从 $! 捕获进程 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 中工作。)

相关内容