So implementieren Sie "set -o pipefail" auf POSIX-Weise - fast fertig, es wird fachkundige Hilfe benötigt

Ich muss die BASH-Option "set -o pipefail" auf POSIX-Weise implementieren, damit sie auf verschiedenen LINUX / UNIX-Versionen funktioniert. Mit dieser Option kann der Benutzer die erfolgreiche Ausführung aller weitergeleiteten Befehle überprüfen. Mit dieser Option wird dieser Befehl cat app.log | aktiviert grep 'ERROR' schlägt fehl, wenn 'cat' fehlschlägt, andernfalls wird der 'cat'-Fehler unterdrückt.

Also habe ich hier eine wirklich schöne Lösung gefunden: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
       }

Die oben erwähnte Funktion run () ermöglicht es dem Benutzer, die weitergeleiteten Befehle folgendermaßen aufzurufen: runcmd1 \| cmd2 \| cmd3 Wenn einer der Befehle fehlschlägt, erhalten Sie ihn in $?

Es gibt jedoch ein Problem, das die Gruppierung von Befehlen zwischen Pipes nicht unterstützt. Ich möchte in der Lage sein, so etwas aufzurufen:

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

Wenn ich es tue, schlägt der Aufruf fehl. Ich kann nicht die richtige Änderung finden, um die Gruppierung von Befehlen zu unterstützen - das Skript ist etwas zu komplex für meine Bash-Fähigkeiten ... Könnte jemand helfen?

Vielen Dank!

Es gibt eine Definition einer run () -Funktion, mit der der Benutzer die über die Pipeline übertragenen Befehle folgendermaßen ausführen kann:

Antworten auf die Frage(3)

Ihre Antwort auf die Frage