Consider the following (with sh
being /bin/dash
):
$ strace -e trace=process sh -c 'grep "^Pid:" /proc/self/status /proc/$$/status'
execve("/bin/sh", ["sh", "-c", "grep \"^Pid:\" /proc/self/status /"...], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7fcc8b661540) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcc8b661810) = 24865
wait4(-1, /proc/self/status:Pid: 24865
/proc/24864/status:Pid: 24864
[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 24865
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24865, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
exit_group(0) = ?
+++ exited with 0 +++
There's nothing unusual, grep
replaced a forked process (here done via clone()
) from main shell process. So far so good.
Now with bash 4.4:
$ strace -e trace=process bash -c 'grep "^Pid:" /proc/self/status /proc/$$/status'
execve("/bin/bash", ["bash", "-c", "grep \"^Pid:\" /proc/self/status /"...], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f8416b88740) = 0
execve("/bin/grep", ["grep", "^Pid:", "/proc/self/status", "/proc/25798/status"], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f8113358b80) = 0
/proc/self/status:Pid: 25798
/proc/25798/status:Pid: 25798
exit_group(0) = ?
+++ exited with 0 +++
Here what's apparent is that grep
assumes pid of the shell process and no apparent fork()
or clone()
call. Question is, then, how does bash
achieve such acrobatics without either of the calls ?
Note, however, that clone()
syscalls appears if the command contains shell redirection, such as df > /dev/null
grep
.bash
may be smart enough to not fork when only executing a single external command. – Kusalananda Sep 03 '18 at 06:10CMD_NO_FORK
if there's no pipes (and apparently no redirections) – Sergiy Kolodyazhnyy Sep 03 '18 at 06:12execve
sincesleep
is built in, but Homer's answer does appropriately answer it, but again just a brief summary. I guess I should have mentioned I was looking for exact mechanics on source code level. Would you say my answer be suitable as supporting Homers on that post ? I don't mind this post being closed. I got the answer either way – Sergiy Kolodyazhnyy Sep 03 '18 at 06:44ksh93
that tries to avoid forks if possible. – schily Sep 03 '18 at 09:49