KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
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
Tags (comma-separated)
Save Edits
Cancel