linux - und - unix shell script redirect stdout stderr




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

Um stdout zu einer abgeschnittenen Datei in Bash umzuleiten, weiß ich:

cmd > file.txt

Um stdout in Bash umzuleiten und an eine Datei anzuhängen, weiß ich:

cmd >> file.txt

Um sowohl stdout als auch stderr auf eine abgeschnittene Datei umzuleiten, weiß ich:

cmd &> file.txt

Wie leite ich sowohl stdout als auch stderr an eine Datei um? cmd &>> file.txt funktionierte nicht für mich.


Dies sollte gut funktionieren:

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

Es speichert alle Logs in file.txt und gibt sie auf dem Terminal aus.


In Bash 4 (sowie ZSH 4.3.11):

cmd &>>outfile

gerade aus der Box


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

Der klassische und portable ( 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 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 #!/bin/sh beginnt (egal ob beabsichtigt oder nicht), dann ist die Bash 4-Lösung und im Allgemeinen jeder Bash-spezifische Code nicht der richtige Weg.

Bedenken Sie auch, dass Bash 4 &>> nur eine kürzere Syntax ist - es führt keine neuen Funktionen oder ä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


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 von operator > oder >> (append) zu einem anderen Dateideskriptor oder einer Datei umgeleitet werden.

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

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





pipe