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)
任何使用 subshell 的尝试也对我不起作用。
echo $(echo $BASHPID ; exec sleep 10) ; echo $?
Run Code Online (Sandbox Code Playgroud)
这是可行的,但是子shell 将其所有输出管道传送到echo,并且echo 一次打印所有输出,这意味着$BASHPID
直到睡眠完成后才会打印。PID 必须立即打印。
运行时,例如:
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)