
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_fail
und 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 ERR
Falle) 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).