Frage Was könnte `>` unter Linux zum Scheitern bringen?


Ich habe diesen Befehl ausgeführt:

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

Um Daten in den partyapp_dump.json Datei. Aber alle Daten werden nur auf dem Bildschirm gedruckt und leer partyapp_dump.json Datei wird erstellt.

Warum konnte das passieren? Ich habe getestet ls > partyapp_dump.json und das hat perfekt funktioniert.


20
2018-04-14 11:14


Ursprung




Antworten:


Mit > Sie leiten nur die Standardausgabe um. Versuchen 2> Stattdessen um die Fehlerausgabe umzuleiten. Benutzen &> beide umleiten.


40
2018-04-14 11:20



Zu Ihrer Information, &> funktioniert nur in Bash 4.0 und iirc neueren Versionen von zsh. Für eine tragbare Lösung, foo > bar 2&>1. Referenz: mywiki.wooledge.org/BashFAQ/014 - Rein Henrichs
@Rein Henrichs: Das ist 2> & 1, nicht 2 &> 1 - camh
Ich erinnere mich mit einer pneumonischen (?) Von der Programmierung: '2', bis ('>') die Position ('&') von '1' - hometoast
@ Hometoast: Du meinst Mnemonic? :) Lungenentzündung bedeutet Lunge ... - carlpett
Hah! Ja. Dank dafür. - hometoast


Ihre Python-App muss ihre Ausgabe in den STDERR-Ausgabekanal anstatt in das normale STDOUT schreiben. Verwenden des Shell-Konstrukts > fängt nur Daten ab und leitet sie um, die in den Ausgabekanal geschrieben werden, aber es gibt tatsächlich mehrere andere Kanäle, auf die gedruckt werden kann, wobei der gebräuchlichste der zweite ist, der normalerweise für Fehler verwendet wird.

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

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

Das 2>&1 Konstrukt verbindet den Ausgabestrom 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 wäre das für Debug-Informationen und nicht für Anwendungsdaten reserviert. Bitte Verwenden Sie dieses Skript mit einiger Vorsicht da es sich in einer nicht standardisierten Weise verhält.

Sie können die Ausgabe- und Fehlerkanäle auch auf andere Dateien ausgeben:

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

22
2018-04-14 11:19





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


5
2018-04-14 11:53





Wenn die noclobber Bash-Option gesetzt ist, dann> Umleitung wird fehlschlagen (wenn auch nicht stillschweigend), wenn die Zieldatei bereits existiert.

Für eine bessere Portabilität verwenden cmd >| file um das Überschreiben einer vorhandenen Datei zu erzwingen.


1
2018-04-15 06:12





Wenn Sie verloren sind, können Sie immer versuchen, es mit strace auszuführen, um zu sehen, was Prozesse tun:

strace -f command

0
2018-04-14 12:57



Wahre Antwort, aber nicht besonders relevant. Wenn der Typ jetzt nicht den Fehler-Stream verwaltet, denke ich nicht, dass er wissen wird, was er mit der Ausgabe eines strace. - Caleb