Search code examples
bashnamed-pipesexit-code

Capture non-zero exit code from named pipe


The following toy script (tmp.sh) exits with code 0 even if the process sent to the named pipe fails. How can I capture the non-zero exit code from the named pipe? Or more in general, the fact that something has gone wrong?

#!/bin/bash

set -eo pipefail

mkfifo mypipe
FOOBAR > mypipe &

cat mypipe

Run and check exit code:

bash tmp.sh
tmp.sh: line 6: FOOBAR: command not found

echo $? # <- Exit code is 0 despite the "command not found"!

Solution

  • You need to capture process id of background process and wait for it to set the correct exit status:

    #!/bin/bash
    set -eo pipefail
    
    rm -f mypipe
    mkfifo mypipe
    
    FOOBAR > mypipe &
    # store process id of above process into pid
    pid=$!
    
    cat mypipe
    
    # wait for background process to complete
    wait $pid
    

    Now when you run it:

    bash tmp.sh
    tmp.sh: line 6: FOOBAR: command not found
    echo $?
    127