it-swarm.com.de

Wie kann ich stdout und stderr an eine Datei mit Bash umleiten und anhängen?

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.

1304
flybywire
cmd >>file.txt 2>&1

Bash führt die Weiterleitungen von links nach rechts wie folgt aus:

  1. >>file.txt: file.txt im Anfügemodus öffnen und stdout dort umleiten.
  2. 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.
1709
Alex Martelli

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

  • entscheiden Sie, ob Portabilität ein Problem ist (verwenden Sie dann die klassische Methode).
  • entscheiden Sie, ob die Portabilität auch für Bash pre-4 ein Problem ist (verwenden Sie dann die klassische Methode).
  • egal welche Syntax Sie verwenden, ändern Sie sie nicht innerhalb desselben Skripts (Verwirrung!)

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

323
TheBonsai

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
80
Aaron R.

In Bash 4 (sowie ZSH 4.3.11):

cmd &>>outfile

nur aus der Box

60
A B

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.

42
Pradeep Goswami

Versuche dies

You_command 1>output.log  2>&1

Ihre Verwendung von &> x.file funktioniert in bash4. das tut mir leid : (

Hier einige zusätzliche Tipps.

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

22
Quintus.Zhou

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:

  1. Leiten Sie stderr zu stdout um.
  2. Leiten Sie das neue stdout um, indem Sie es an eine Datei anhängen.

Die Klammern entfernen außerdem jegliche Mehrdeutigkeit der Reihenfolge, insbesondere wenn Sie stattdessen stdout und stderr an einen anderen Befehl übergeben möchten.

0
jamesdlin