How do I get the correct return code from a unix command line application after I’ve piped it through another command that succeeded?
In detail, here’s the situation :
$ tar -cEvhf - -I ${sh_tar_inputlist} | gzip -5 -c > ${sh_tar_file} -- when only the tar command fails $?=0
$ echo $?
0
And, what I’d like to see is:
$ tar -cEvhf - -I ${sh_tar_inputlist} 2>${sh_tar_error_file} | gzip -5 -c > ${sh_tar_file}
$ echo $?
1
Does anyone know how to accomplish this?
Here is a general solution using only POSIX shell and no temporary files:
Starting from the pipeline:
foo | bar | baz
$error_statuses contains the status codes of any failed processes, in random order, with indexes to tell which command emitted each status.