Jak zaimplementować 'set -o pipefail' w sposób POSIX - prawie gotowe, potrzebna jest pomoc eksperta

Muszę zaimplementować opcję BASH „set -o pipefail” w sposób POSIX, aby działała na różnych odmianach LINUX / UNIX. Aby wyjaśnić trochę, opcja ta umożliwia użytkownikowi weryfikację pomyślnego wykonania wszystkich poleceń potokowych. Po włączeniu tej opcji polecenie cat app.log | grep 'ERROR' nie powiedzie się, jeśli zawiedzie 'cat', w przeciwnym razie błąd 'cat' zostanie pominięty.

Więc znalazłem naprawdę fajne rozwiązanie: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
       }

Wyżej wymieniona funkcja run () umożliwia użytkownikowi wywołanie potokowych poleceń w taki sposób: uruchomcmd1 \| cmd2 \| cmd3 Jeśli jedno z poleceń zawiedzie, otrzymasz je w $?

Istnieje jednak problem, nie obsługuje grupowania poleceń między rurami. Chcę móc wywołać coś takiego:

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

Kiedy to robię, wywołanie nie powiedzie się. Nie mogę uzyskać odpowiedniej modyfikacji, aby obsługiwać grupowanie poleceń - skrypt jest trochę zbyt skomplikowany dla moich umiejętności basha ... Czy ktoś może pomóc?

Dzięki!

Istnieje definicja funkcji run (), która umożliwia użytkownikowi uruchamianie potokowych poleceń w taki sposób:

questionAnswers(3)

yourAnswerToTheQuestion