从 1 行 bash 调用中获取 PID 和返回代码

chu*_*500 3 bash process subshell exit-status

想象一下我们有一个很长的命令sleep 10(例如)。我们想在另一台服务器上使用 python(paramiko特定的 ssh 库)执行它。

我需要一个 1 行命令来启动命令,打印命令的 PID,然后等待它完成并最终返回命令的退出状态。

到目前为止我尝试过的:

bash -c "echo $BASHPID ; exec sleep 10" ; echo $?
Run Code Online (Sandbox Code Playgroud)

这将打印 shell 的 PID,然后在长命令上调用 exec,然后等待并打印退出状态。问题是$BASHPID打印外部 bash shell 的 PID(可能表明调用bash -c cmd实际上并没有产生一个全新的 shell?)。

如果我在三行中调用上述命令,它就可以工作。

bash
echo $BASHPID ; exec sleep 10
echo $?
Run Code Online (Sandbox Code Playgroud)

任何使用 subshel​​l 的尝试也对我不起作用。

echo $(echo $BASHPID ; exec sleep 10) ; echo $?
Run Code Online (Sandbox Code Playgroud)

这是可行的,但是子shell 将其所有输出管道传送到echo,并且echo 一次打印所有输出,这意味着$BASHPID直到睡眠完成后才会打印。PID 必须立即打印。

Jef*_*ler 5

运行时,例如:

bash -c "echo $BASHPID ; exec sleep 10"

或者

echo $(echo $BASHPID ; exec sleep 10)

您当前的外壳程序$BASHPID在第二个 bash(或子外壳程序)看到它之前插入变量。解决方案是防止当前 shell 扩展这些变量:

bash -c 'echo $BASHPID ; exec sleep 10'
Run Code Online (Sandbox Code Playgroud)