Sie können die Datei nach dem Ausführen, falls der Befehl fehlschlägt, mit
löschenmyAPICommand parameters > myFile.txt || rm myFile.txt
Aber ich würde vorschlagen, stattdessen die Datei zu überschreiben:
myAPICommand parameters >| myFile.txt
Siehe Was sind die Steuerungs- und Umleitungsoperatoren der Shell? für Details.
Sie müssen "noclobber" gesetzt haben, sehen Sie sich das folgende Beispiel an:
$ echo 1 > 1 # create file
$ cat 1
1
$ echo 2 > 1 # overwrite file
$ cat 1
2
$ set -o noclobber
$ echo 3 > 1 # file is now protected from accidental overwrite
bash: 1: cannot overwrite existing file
$ cat 1
2
$ echo 3 >| 1 # temporary allow overwrite
$ cat 1
3
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ cat 1
3
$ set +o noclobber
$ echo 4 > 1
$ cat 1
4
"noclobber" dient nur zum Überschreiben, Sie können aber trotzdem anhängen:
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1
Um zu überprüfen, ob Sie dieses Flag gesetzt haben, können Sie echo $-
eingeben und prüfen Sie, ob Sie C
haben Flag gesetzt (oder set -o |grep clobber
).
F:Wie kann ich vermeiden, eine leere Datei zu schreiben, wenn mein Basisbefehl fehlschlägt?
Irgendwelche Anforderungen? Sie könnten die Ausgabe einfach in einer Variablen speichern und dann prüfen, ob sie leer ist. Überprüfen Sie das folgende Beispiel (beachten Sie, dass die Art und Weise, wie Sie die Variable überprüfen, an Ihre Bedürfnisse angepasst werden muss, im Beispiel habe ich sie nicht zitiert oder so etwas wie ${cmd_output+x}
verwendet die prüft, ob die Variable gesetzt ist, um zu vermeiden, dass eine Datei geschrieben wird, die nur Leerzeichen enthält.
$ cmd_output=$(echo)
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e '\n\n\n')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e ' ')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e 'something')
$ test $cmd_output && echo yes || echo no
yes
$ cmd_output=$(myAPICommand.exe parameters)
$ test $cmd_output && echo "$cmd_output" > myFile.txt
Beispiel ohne Verwendung einer einzigen Variablen, die die gesamte Ausgabe enthält:
log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log
Sie könnten ein Skript erstellen, um myAPICommand.exe auszuführen, aber lassen Sie es zuerst myFile.txt entfernen, falls vorhanden. Dann müssen Sie nicht ständig den Befehl rm zum Aufräumen ausführen.
Wie:
if [ -e myFile.txt ]
then
rm myFile.txt && myAPICommand.exe
else
Sie könnten es auch so machen, dass Ihr Befehl nach sich selbst aufräumt. Wenn die Datei leer ist, fügen Sie etwas wie das Folgende hinzu.
Wie:
if [ -s myFile.txt ]
then
EXIT 0
else
rm myFile.txt && EXIT 1
fi