I have to implement the Bash set -o pipefail option in a POSIX way so that it works on various Linux/Unix flavors. To explain a bit, this option enables the user to verify the successful execution of all piped commands. With this option enabled this command tail app.log | grep 'ERROR' fails if grep fails, otherwise the tail error is suppressed.

So, I found a really nice solution here: http://cfaj.ca/shell/cus-faq-2.html

run() {
   j=1
   while eval "\${pipestatus_$j+:} false"; do
       unset pipestatus_$j
       j=$(($j+1))
   done
   j=1 com= k=1 l=
   for a; do
       if [ "x$a" = 'x|' ]; then
           com="$com { $l "'3>&-
                       echo "pipestatus_'$j'=$?" >&3
               } 4>&- |'
           j=$(($j+1)) l=
       else
           l="$l \"\$$k\""
       fi
           k=$(($k+1))
   done
   com="$com $l"' 3>&- >&4 4>&-
   echo "pipestatus_'$j'=$?"'
   exec 4>&1
   eval "$(exec 3>&1; eval "$com")"
   exec 4>&-
   j=1
   while eval "\${pipestatus_$j+:} false"; do
       eval "[ \$pipestatus_$j -eq 0 ]" || return 1
       j=$(($j+1))
   done
   return 0
}

The above-mentioned run() function enables the user to invoke the piped commands in such a way:

run cmd1 \| cmd2 \| cmd3

If one of the commands fails you get it in $?

There is a problem, however; it does not support the grouping of commands between pipes. I want to be able to invoke something like this:

run echo "test" ; grep "test" \| awk '{print}'

When I do it, the invocation fails. I cannot get the right modification to support the

Edit
Report