后台组合命令时,如何获取“基础”命令的进程标识?

后台组合命令时,如何获取“基础”命令的进程标识?

例如:

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 内置命令或变量可以获取它)。

相关内容