Get exit code from subshell through the pipes Get exit code from subshell through the pipes bash bash

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"


Beware of this when using local variables:

local OUT=$(command; exit 1)echo $? # 0OUT=$(command; exit 1)echo $? # 1


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