bashpipeexit-codeteesubshell

Get exit code from subshell through the pipes


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.


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"