Bumped into an unexpected bash
/sh
behavior and I wonder someone can explain the rationale behind it, and provide a solution to the question below.
In an interactive bash
shell session, I execute:
$ bash -c 'sleep 10 && echo'
With ps
on Linux it looks like this:
\_ -bash
\_ bash -c sleep 10 && echo
\_ sleep 10
The process tree is what I would expect:
- My interactive bash shell process (
$
) - A children shell process (
bash -c ...
) - a sleep children process
However, if the command portion of my bash -c
is a single command, e.g.:
$ bash -c 'sleep 10'
Then the middle sub-shell is swallowed, and my interactive terminal session executes sleep "directly" as children process. The process tree looks like this:
\_ -bash
\_ sleep 10
So from process tree perspective, these two produce the same result:
$ bash -c 'sleep 10'
$ sleep 10
What is going on here?
Now to my question: is there a way to force the intermediate shell, regardless of the complexity of the expression passed to bash -c ...
?
(I could append something like ; echo;
to my actual command and that "works", but I'd rather not. Is there a more proper way to force the intermediate process into existence?)
(edit: typo in ps
output; removed sh
tag as suggested in comments; one more typo)
\_ bash -c sleep 10 && echo
instead of\_ bash -c sleep 10 && sleep 10
on line 2 of your first ps tree? – Eton