碰到一个意外的bash
/sh
行为,我想知道有人可以解释它背后的基本原理,并为下面的问题提供解决方案。当执行单个命令时,Bash'吞咽'子shell子进程
在交互式bash
shell会话,我执行:
$ bash -c 'sleep 10 && echo'
随着ps
在Linux上看起来是这样的:
\_ -bash \_ bash -c sleep 10 && echo \_ sleep 10
进程树是我所期望的:
- 我互动的bash shell进程(
$
) - 一个孩子shell进程(
bash -c ...
) - 睡眠的孩子处理
但是,如果我bash -c
的命令部分是单命令,例如:
$ bash -c 'sleep 10'
然后,中间子外壳被吞噬,并且当儿童处理时,我的交互式终端会话“直接”执行睡眠。 进程树是这个样子:
\_ -bash \_ sleep 10
所以从进程树的角度来看,这两个产生相同的结果:
$ bash -c 'sleep 10'
$ sleep 10
这是怎么回事在这?
现在我的问题:有没有办法强制中间壳,无论表达式的复杂度传递给bash -c ...
?
(我可以追加类似; echo;
到我的实际命令和“作品”,但我宁愿不有没有更合适的方式来迫使中间过程产生了。?)
(编辑:错字在ps
输出;去除sh
标签在评论建议;多一个错字)
为什么你会*不*希望这种优化时,它的可能吗? –
在用户可以传递任意命令的环境中处理子进程时,主要确保一致的行为。我不确定绕过这个优化是我的解决方案(我遇到的实际问题必须处理sudo的更改:https://stackoverflow.com/a/34376188)。但是这种行为很有趣,我想了解更多。 – Marco
伟大的问题。你的意思是说你在第一个ps树的第2行用'\ _ bash -c sleep 10 && echo'代替'\ _ bash -c sleep 10 && sleep 10'吗? – codeforester