![后台组合命令时,如何获取“基础”命令的进程标识?](https://linux22.com/image/1144782/%E5%90%8E%E5%8F%B0%E7%BB%84%E5%90%88%E5%91%BD%E4%BB%A4%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E2%80%9C%E5%9F%BA%E7%A1%80%E2%80%9D%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%A0%87%E8%AF%86%EF%BC%9F.png)
例如:
printstuffslowly | ts -s &
ARECORD_PID=$!
或者:
arecord [options] > ~/recording.wav 2> >(ts -s > ~/errors.log) &
ARECORD_PID=$!
从我在命令行上的测试来看,$ARECORD_PID
结果显示ts
的 PID。但我认为我想要的是printstuffslowly
的 PID 或arecord
的 PID,这样我就可以循环更多命令直到它退出:
while kill -0 "$ARECORD_PID" > /dev/null 2>&1
do
sleep 1
sync
done
有办法实现吗?或者ts
的 PID 实际上是否也能满足我的目的?
答案1
它仍然是 的 PID arecord
。来自bash 手册:
($!) 扩展为最近放入后台的作业的进程 ID,无论是作为异步命令执行还是使用
bg
内置命令执行
进程替换中的命令需要在后台命令之前启动:
当可用时,进程替换与参数和变量扩展、命令替换以及算术扩展同时执行。
因此 PID 基本上丢失了(你仍然可以使用pgrep
它,但没有 bash 内置命令或变量可以获取它)。