Bash stoppt Pipe, wenn der Befehl fehlschlägt

Bash stoppt Pipe, wenn der Befehl fehlschlägt

Beachten Sie das folgende Skript

#!/usr/bin/env bash

set -eux
set -o pipefail


function will_fail() {
    echo 'I do not work because of xyz' >&2
    exit 1
}

will_fail | gzip > test.gz

Dadurch wird eine Datei erstellttest.gz

Gibt es eine Möglichkeit, mit Pipes anzuhalten will_failund nicht zu erstellen test.gz?

Antwort1

Da die Ausgabedatei vor dem Start der Pipeline erstellt wird, gibt es keine Möglichkeit, die Erstellung der Ausgabedatei zu verhindern.

Ihre einzige Möglichkeit besteht also darin, die Datei bei einem Ausfall der Pipeline erneut zu entfernen.

Wenn Sie nach einer Skriptlösung suchen, kann eine kshism(die ERRFalle) verwendet werden, die in unterstützt wird .bash

In diesem Fall empfehle ich dringend die Verwendung

set -o noclobber

Um zu verhindern, dass die Datei überschrieben wird, falls sie bereits vorhanden ist.

Der empfohlene Code würde also folgendermaßen aussehen:

set -o noclobber

trap 'rm -rf test.gz' ERR

some_cmd | gzip > test.gz

Antwort2

if ! will_fail | gzip >test.gz; then
        rm -f test.gz
fi

Dies verhindert nicht die Erstellung der Datei (die Umleitung erstellt die Datei, bevor die Pipeline ausgeführt wird), entfernt die Datei jedoch, wenn die Pipeline fehlschlägt (vorausgesetzt pipefail, sie ist wie im Beispiel festgelegt).

verwandte Informationen