Hi, Comming on this very old thread:
On Wed, 4 Dec 2013 14:40:11 -0500, Greg Wooledge wrote: > > The most obvious difference is that $? is shorter. > > $? is also POSIX standard (older than POSIX in fact), so it works in sh > scripts as well. PIPESTATUS is a Bash extension. > > Finally, note that if you execute a pipeline, $? will contain the exit > status of the last command in the pipeline, not the first command, > which is what ${PIPESTATUS[0]} would contain. (If you execute a simple > command instead of a pipeline, then they would both have the same value.) Some asked on StackOverflow.com: Why does a Bash while loop result in PIPESTATUS "1" instead of "0"? https://stackoverflow.com/q/78351657/1765658 Then after some tests: if ls /wrong/path | wc | cat - /wrong/path | sed 'w/wrong/path' >/dev/null ; then echo Don't print this' fi ; echo ${?@Q} ${PIPESTATUS[@]@A} $(( $? ${PIPESTATUS[@]/#/+} )) ls: cannot access '/wrong/path': No such file or directory cat: /wrong/path: No such file or directory sed: couldn't open file /wrong/path: No such file or directory '0' declare -a PIPESTATUS=([0]="2" [1]="0" [2]="1" [3]="4") 7 Where $PIPESTATUS[0]=>2 and $?=>0 !! I could explain that '$?' is result of bash's if...then...fi group command executed correctly and PIPESTATUS hold result of "most-recently-executed foreground pipeline", but man page say: PIPESTATUS An array variable (see Arrays below) containing a list of exit status values from the processes in the most-recently-executed foreground pipeline (which may contain only a single command). ? Expands to the exit status of the most recently executed fore‐ ground pipeline. If so, "$?" have to be equivalent to "${PIPESTATUS[0]}", I think. I suggest that man page should be modified to replace "foreground pipeline" by "command" under "?" paragraph. -- Félix Hauri - <fe...@f-hauri.ch> - http://www.f-hauri.ch