Um stdout in eine abgeschnittene Datei in Bash umzuleiten , muss ich Folgendes verwenden:
cmd > file.txt
Um stdout in Bash umzuleiten und an eine Datei anzuhängen, muss ich Folgendes verwenden:
cmd >> file.txt
Um sowohl stdout als auch stderr in eine abgeschnittene Datei umzuleiten , muss ich Folgendes verwenden:
cmd &> file.txt
Wie leite ich sowohl stdout als auch stderr um , die an eine Datei angehängt werden? cmd &>> file.txt
hat bei mir nicht funktioniert.
Antworten:
Bash führt die Weiterleitungen von links nach rechts wie folgt aus:
>>file.txt
:file.txt
Im Append-Modus öffnen und dort umleitenstdout
.2>&1
: Weiterleitenstderr
zu "wohinstdout
geht es gerade" . In diesem Fall handelt es sich um eine Datei, die im Anhänge-Modus geöffnet wurde. Mit anderen Worten, das&1
verwendet denstdout
aktuell verwendeten Dateideskriptor wieder.quelle
cmd >>file1 2>>file2
, sollte es das erreichen, was Sie wollen.Abhängig von Ihrer Bash-Version gibt es zwei Möglichkeiten, dies zu tun.
Der klassische und tragbare Weg ( Bash Pre-4 ) ist:
Ein nicht portabler Weg, beginnend mit Bash 4, ist
(analog zu
&> outfile
)Für einen guten Codierungsstil sollten Sie
Wenn Ihr Skript bereits mit beginnt
#!/bin/sh
(egal ob beabsichtigt oder nicht), ist die Bash 4-Lösung und im Allgemeinen jeder Bash-spezifische Code nicht der richtige Weg.Denken Sie auch daran, dass Bash 4
&>>
nur eine kürzere Syntax ist - es werden keine neuen Funktionen oder ähnliches eingeführt.Die Syntax wird (neben anderer Umleitungssyntax) hier beschrieben: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
quelle
sh
. Sie können die Standard-Shell ändernSHELL=/bin/bash
, indem Sie dercrontab -e
Datei ein Präfix voranstellen .In Bash können Sie Ihre Weiterleitungen zu verschiedenen Dateien auch explizit angeben:
Das Anhängen wäre:
quelle
cmd >log.out 2>&1
. Ich bearbeite meine Antwort, um das erste Beispiel zu entfernen.In Bash 4 (sowie ZSH 4.3.11):
nur aus der Box
quelle
Dies sollte gut funktionieren:
Alle Protokolle werden in file.txt gespeichert und auf dem Terminal gespeichert .
quelle
Versuche dies
Ihre Verwendung von &> x.file funktioniert in bash4. das tut mir leid : (
Hier kommen einige zusätzliche Tipps.
0, 1, 2 ... 9 sind Dateideskriptoren in bash.
0 steht für
stdin
, 1 steht fürstdout
, 2 steht fürstderror
. 3 ~ 9 ist für jede andere vorübergehende Verwendung frei.Jeder Dateideskriptor kann mithilfe des Operators
>
oder>>
(Anhängen) zu einem anderen Dateideskriptor oder einer anderen Datei umgeleitet werden .Verbrauch: < file_descriptor > > < Dateiname | & file_descriptor >
Bitte verweisen Sie auf http://www.tldp.org/LDP/abs/html/io-redirection.html
quelle
You_command
an stdout und den stdout vonYou_command
an die Datei umoutput.log
. Außerdem wird es nicht an die Datei angehängt, sondern überschrieben.1 > output.log 2>&1
Ich bin überrascht, dass in fast zehn Jahren noch niemand diesen Ansatz veröffentlicht hat:
Wenn Sie ältere Versionen von bash verwenden, die
&>>
nicht verfügbar sind, können Sie auch Folgendes tun:Dieser laicht eine Subshell, so ist es weniger effizient als der traditionelle Ansatz
cmd >> file.txt 2>&1
, und es wird folglich keine Arbeit für Befehle, die Notwendigkeit , die aktuelle Shell (zB zu modifizierencd
,pushd
), aber dieser Ansatz fühlt sich natürlich und verständlich zu mir:Außerdem entfernen die Klammern alle Unklarheiten in der Reihenfolge, insbesondere wenn Sie stattdessen stdout und stderr an einen anderen Befehl weiterleiten möchten.
quelle
cmd >> file 2>&1
funktioniert in allen Shells und erfordert keinen zusätzlichen Prozess zum Ausführen.