Um stdout zu einer abgeschnittenen 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 stdout und stderr in eine abgeschnittene Datei umzuleiten, kann 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.
cmd >>file.txt 2>&1
Bash führt die Weiterleitungen von links nach rechts wie folgt aus:
>>file.txt
: file.txt
im Anfügemodus öffnen und stdout
dort umleiten.2>&1
: Umleitung stderr
nach "wo stdout
gerade läuft" . In diesem Fall ist dies eine Datei, die im Anfügemodus geöffnet wird. Mit anderen Worten, der &1
verwendet den Dateideskriptor, den stdout
aktuell verwendet.Es gibt zwei Möglichkeiten, dies zu tun, abhängig von Ihrer Bash-Version.
Der klassische und tragbare (Bash pre-4) Weg ist:
cmd >> outfile 2>&1
Ein nicht portabler Weg, beginnend mit Bash 4 ist
cmd &>> outfile
(analog zu &> outfile
)
Für einen guten Codierstil sollten Sie
Wenn Ihr Skript bereits mit #!/bin/sh
beginnt (egal ob beabsichtigt oder nicht), dann ist die Bash 4-Lösung und generell kein Bash-spezifischer Code 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 anderen Umleitungssyntax) hier beschrieben: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output
In Bash können Sie Ihre Weiterleitungen zu anderen Dateien auch explizit angeben:
cmd >log.out 2>log_error.out
Anhängen wäre:
cmd >>log.out 2>>log_error.out
In Bash 4 (sowie ZSH 4.3.11):
cmd &>>outfile
nur aus der Box
Das sollte gut funktionieren:
your_command 2>&1 | tee -a file.txt
Es speichert alle Protokolle in file.txt und speichert sie auch auf dem Terminal.
Versuche dies
You_command 1>output.log 2>&1
Ihre Verwendung von &> x.file funktioniert in bash4. das tut mir leid : (
0, 1, 2 ... 9 sind Dateideskriptoren in bash.
0 steht für stdin
, 1 steht für stdout
, 2 steht für stderror
. 3 ~ 9 ist für jede andere vorübergehende Verwendung frei.
Jeder Dateideskriptor kann mit dem Operator >
oder >>
(append) in einen anderen Dateideskriptor oder eine andere Datei umgeleitet werden.
Verwendung: <File_descriptor> > <Dateiname | & file_descriptor>
Bitte beziehen Sie sich auf http://www.tldp.org/LDP/abs/html/io-redirection.html
Ich bin überrascht, dass in fast zehn Jahren noch niemand diesen Ansatz veröffentlicht hat:
Wenn Sie ältere Versionen von bash verwenden, für die &>>
nicht verfügbar ist, können Sie auch Folgendes tun:
(cmd 2>&1) >> file.txt
Dies führt zu einer Subshell und ist daher weniger effizient als der traditionelle Ansatz von cmd >> file.txt 2>&1
, aber dieser Ansatz fühlt sich für mich natürlicher und verständlicher an:
Die Klammern entfernen außerdem jegliche Mehrdeutigkeit der Reihenfolge, insbesondere wenn Sie stattdessen stdout und stderr an einen anderen Befehl übergeben möchten.