Get exit code from subshell through the pipes
By using $()
you are (effectively) creating a subshell. Thus the PIPESTATUS
instance you need to look at is only available inside your subshell (i.e. inside the $()
), since environment variables do not propagate from child to parent processes.
You could do something like this:
OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt"; exit ${PIPESTATUS[0]} ); echo $? # prints exit code of wget.
You can achieve a similar behavior by using the following:
OUT=$(wget -q "http://budueba.com/net") rc=$? # safe exit code for later echo "$OUT" | tee -a "file.txt"
Copy the PIPESTATUS array first. Any reads destroy the current state.
declare -a PSA cmd1 | cmd2 | cmd3 PSA=( "${PIPESTATUS[@]}" )
I used fifos to solve the sub-shell/PIPESTATUS problem. Seebash pipestatus in backticked command?
I also found these useful: bash script: how to save return value of first command in a pipeline?
and https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/70675#70675