Was könnte dazu führen, dass `>` unter Linux stillschweigend ein Fehler auftritt?

20

Ich habe diesen Befehl ausgeführt:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json

So speichern Sie Daten in der partyapp_dump.jsonDatei. Alle Daten werden jedoch nur auf dem Bildschirm gedruckt und eine leere partyapp_dump.jsonDatei wird erstellt.

Warum könnte das passieren? Ich habe getestet ls > partyapp_dump.jsonund das hat perfekt funktioniert.

Ram Rachum
quelle

Antworten:

40

Mit > leiten Sie nur die Standardausgabe um. Versuchen Sie stattdessen 2> , um die Fehlerausgabe umzuleiten. Verwenden Sie &> , um beide umzuleiten.

fabelhaft
quelle
1
Zu &>Ihrer Information , funktioniert nur in Bash 4.0 und iirc neueren Versionen von zsh. Für eine tragbarere Lösung foo > bar 2&>1. Referenz: mywiki.wooledge.org/BashFAQ/014
Rein Henrichs
6
@ Rein Henrichs: Das ist 2> & 1, nicht 2 &> 1
camh
Ich erinnere mich mit einem pneumonischen (?)
Befehl
1
@hometoast: Du meinst mnemonisch? :) Pneumonic bedeutet Lunge ...
Carlpett
22

Ihre Python-App muss die Ausgabe auf den STDERR-Ausgabekanal anstatt auf das normale STDOUT schreiben. Mit dem Shell-Konstrukt werden >nur Daten abgefangen und umgeleitet, die in den Ausgabekanal geschrieben wurden. Tatsächlich können jedoch mehrere andere Kanäle gedruckt werden, wobei der häufigste der zweite ist, der normalerweise für Fehler verwendet wird.

Sie können versuchen, STDERR (2. Kanal) auch so einzufangen:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2>&1

Das 2>&1Konstrukt verbindet den Ausgabestream für Fehler mit dem normalen Ausgabekanal. Es ist ungewöhnlich, dass ein Programm eine Ausgabe generiert, die Sie auf dem Fehlerkanal erfassen möchten. Normalerweise ist dies für Debug-Informationen und nicht für Anwendungsdaten reserviert. Bitte verwenden Sie dieses Skript mit einem gewissen Vorsicht , da es in einer Nicht-Standard - Art und Weise verhalten.

Sie können die Ausgabe- und Fehlerkanäle auch in verschiedene Dateien wie folgt kopieren:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2> error_output.txt
Caleb
quelle
5

Zusätzlich zu der bereits vorgeschlagenen Erklärung für die Ausgabe von stderr vs stdout kann Ihre Anwendung diese beiden Streams einfach ignorieren und explizit "/ dev / tty" für ihre Ausgabe öffnen.

jlliagre
quelle
1

Wenn die noclobberbash-Option aktiviert ist, schlägt die Umleitung fehl (wenn auch nicht im Hintergrund), wenn die Zieldatei bereits vorhanden ist.

Verwenden Sie diese Option, um cmd >| filedas Überschreiben einer vorhandenen Datei zu erzwingen.

tylerl
quelle
0

Wenn Sie sich verlaufen haben, können Sie immer versuchen, es mit strace auszuführen, um zu sehen, was die Prozesse tun:

strace -f command
bluszcz
quelle
1
Richtige Antwort, aber nicht besonders relevant. Wenn der Typ jetzt nicht über die Verwaltung des Fehlerstroms nachgedacht hätte, würde er wahrscheinlich nicht wissen, was er mit der Ausgabe eines tun soll strace.
Caleb