Get exit code from subshell through the pipes

bash, exit-code, pipe, subshell, tee

Solution

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=$? # save exit code for later
  echo "$OUT" | tee -a "file.txt"

Problem

How can I get exit code of `wget` from the subshell process? So, main problem is that `$?` is equal 0. Where can `$?=8` be founded? ``` $> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "$?" 0 ``` It works without `tee`, actually. ``` $> OUT=$( wget -q "http://budueba.com/net" ); echo "$?" 8 ``` But `${PIPESTATUS}` array (I'm not sure it's related to that case) also does not contain that value. ``` $> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[1]}" $> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[0]}" 0 $> OUT=$( wget -q "http://budueba.com/net" | tee -a "file.txt" ); echo "${PIPESTATUS[-1]}" 0 ``` So, my question is - how can I get `wget`'s exit code through `tee` and subshell? If it could be helpful, my bash version is `4.2.20`.

Original source

Related problems