On 06/18/2010 07:05 AM, Dr. Werner Fink wrote: > Just a remark about the sub shell usage in bash in comparision to > ksh. Let's try: > > strace -f -o bash.strace bash -c 'echo a b | read a b' > > grep -E 'execve|clone|write\(1|read\(0' bash.strace [snip] > > and now the same with the Korn shell > > strace -f -o ksh.strace ksh -c 'echo a b | read a b' > > grep -E 'execve|clone|write\(1|read\(0' ksh.strace | sed 's/^/ /' [snip] > > as now is visible the last command in the pipe sequence done > in the bash is a real sub process whereas in the ksh it is not. > > The question rises: Why does the bash require a sub peocess/shell > for the final command of a pipe sequence.
Running strace -f -o ksh.strace ksh -c 'echo a b | cat' shows that ksh requires a subprocess/shell for the 'cat' which is the final command in _that_ pipe sequence. Apparently ksh knows when the final command in a pipe sequence is a shell builtin, then omits the subprocess in that case. Could bash's $PIPE_STATUS[] or related issues about control, environment, and history ("trap", etc.) be relevant here? --