GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich einen Befehl in eine Datei ausgeben, ohne bei einem Fehler eine leere Datei zu erhalten?

Sie können die Datei nach dem Ausführen, falls der Befehl fehlschlägt, mit

löschen
myAPICommand 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

Linux
  1. Wie kann ich überprüfen, ob eine Datei vorhanden ist, und einen Befehl ausführen, wenn dies nicht der Fall ist?

  2. Wie hängt man die Ausgabe an eine Datei an?

  3. Wie erfasst man die Ausgabe eines Top-Befehls in einer Datei unter Linux?

  4. Wie kann die Ausgabe des Zeitbefehls in eine Datei unter Linux umgeleitet werden?

  5. Wie kann ich die Ausgabe eines Shell-Befehls durchlaufen?

So speichern Sie die Linux-Befehlsausgabe in einem Bild oder einer Textdatei

So leiten Sie die Shell-Befehlsausgabe um

So ändern Sie die Ausgabefarbe von „Echo“ in Linux

So verwenden Sie den Echo-Befehl ohne Zeilenumbruch

Beispiele für Linux-Echo-Befehle

Wie Echo in Datei