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


Umleiten stdout zu einer abgeschnittenen Datei in Bash, weiß ich zu verwenden:

cmd > file.txt

Umleiten stdout in Bash, an eine Datei anhängend, weiß ich zu verwenden:

cmd >> file.txt

Um beide umzuleiten stdout und stderr zu einer abgeschnittenen Datei kann ich Folgendes verwenden:

cmd &> file.txt

Wie leite ich beide um stdout und stderr an eine Datei anhängen? cmd &>> file.txt hat nicht für mich gearbeitet.


1182
2018-05-18 04:19


Ursprung


Antworten:


cmd >>file.txt 2>&1

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

  1. >>file.txt: Offen file.txt im Append-Modus und Redirect stdout Dort.
  2. 2>&1: Umleiten stderr zu "woher stdout läuft gerade ". In diesem Fall ist das eine Datei, die im Append-Modus geöffnet wird. Mit anderen Worten, die &1 wiederverwendet den Dateideskriptor welcher stdout derzeit verwendet.

1559
2018-05-18 04:23



Je nach Bash-Version gibt es hierfür zwei Möglichkeiten.

Der Klassiker und tragbar (Bash vor 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 Codierungsstil sollten Sie

  • Entscheiden Sie, ob Portabilität ein Problem ist (dann verwenden Sie den klassischen Weg)
  • Entscheiden Sie, ob die Portabilität selbst für Bash Pre-4 ein Problem ist (dann verwenden Sie den klassischen Weg)
  • Egal welche Syntax Sie verwenden, ändern Sie sie nicht im selben Skript (Verwirrung!)

Wenn Ihr Skript bereits mit beginnt #!/bin/sh (Egal ob beabsichtigt oder nicht), dann ist die Bash 4-Lösung und im Allgemeinen jeder Bash-spezifische Code nicht der richtige Weg.

Erinnere dich auch an Bash 4 &>> ist nur kürzere Syntax - es führt keine neue Funktionalität oder etwas ähnliches ein.

Die Syntax ist (neben anderer Umleitungssyntax) hier beschrieben: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output


298
2018-05-18 04:42



In Bash können Sie auch explizit Ihre Weiterleitungen zu verschiedenen Dateien angeben:

cmd >log.out 2>log_error.out

Anhängen wäre:

cmd >>log.out 2>>log_error.out

76
2017-07-24 18:09



In Bash 4 (sowie ZSH 4.3.11):

cmd &>>outfile

gerade aus der Box


57
2018-03-27 18:24



Dies sollte gut funktionieren:

your_command 2>&1 | tee -a file.txt

Es speichert alle Protokolle Datei.txt sowie dump sie auf dem Terminal.


32
2017-12-12 06:17



Versuche dies

You_command 1>output.log  2>&1

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ür stdout, 2 steht für stderror. 3 ~ 9 ist Ersatz für jede andere vorübergehende Verwendung.

Jeder Dateideskriptor kann mithilfe eines Operators zu einem anderen Dateideskriptor oder einer Datei umgeleitet werden > oder >>(anhängen).

Verwendung: <file_descriptor> > <Dateiname | & file_descriptor>

Bitte beachten Sie http://www.tldp.org/LDP/abs/html/io-redirection.html


19
2018-04-10 05:56