当尝试获取 shell 命令的 PID 时,可以使用脚本文件:
#!/bin/bash
ls -lha &
echo "$!"
然而,仅使用终端是不可能的。
/bin/bash -c 'ls -lha & ; echo "$!"'
这将返回错误:
/bin/bash:-c:第 1 行:意外标记“;”附近出现语法错误
手册中指出:
列表是由运算符、、或之一分隔的一个或多个管道序列,并可选地由、或 之一终止。在这些列表运算符中,和具有相同的优先级,后跟和,它们具有相同的优先级。
;
&
&&
||
;
&
<newline>
&&
||
;
&
列表中可能会出现一个或多个换行符序列, 而不是分号来分隔命令。
如果命令由控制操作符 终止
&
,则 shell 会在子 shell 中在后台执行该命令。shell 不会等待命令完成,返回状态为 0。以 分隔的命令;
按顺序执行;shell 等待每个命令依次终止。返回状态是最后执行的命令的退出状态。
因此我也尝试使用换行符,但无法使用它:
/bin/bash -c 'ls -lha & \n echo "$!"'
如何调用 shell 命令在后台运行并获取 PID?
PS:我不会使用ls
命令,这是一个更复杂的脚本。这只是一个重现问题的最小示例。
和
;
都是&
命令分隔符。您需要一个来分隔ls
命令和echo
命令,但不能同时使用。只需省略;
和 do如果需要,您可以添加实际的换行符:
或使用
$'…'
:当然,命令之间需要有命令分隔符;每两个连续的命令之间需要一个分隔符。因此,如果你想要有四个命令,其中第一个是异步的,其余的是同步的,你可以使用