Come posso redirect e aggiungere sia stdout che stderr a un file con Bash?

Per redirect lo stdout in un file troncato in Bash, so di usare:

cmd > file.txt 

Per redirect lo stdout in Bash, accodando a un file, so di usare:

 cmd >> file.txt 

Per redirect sia stdout che stderr in un file troncato, so di usare:

 cmd &> file.txt 

Come redirect sia lo stdout che lo stderr in un file? cmd &>> file.txt non ha funzionato per me.

 cmd >>file.txt 2>&1 

Bash esegue i reindirizzamenti da sinistra a destra come segue:

  1. >>file.txt : apri file.txt in modalità append e reindirizza stdout lì.
  2. 2>&1 : Reindirizza stderr a “dove sta attualmente andando stdout . In questo caso, questo è un file aperto in modalità append. In altre parole, &1 riutilizza il descrittore di file che stdout utilizza attualmente.

Ci sono due modi per farlo, a seconda della versione di Bash.

Il modo classico e portatile ( Bash pre-4 ) è:

 cmd >> outfile 2>&1 

Un modo non proporzionale, a partire da Bash 4 è

 cmd &>> outfile 

(analogico a &> outfile )

Per uno stile di codifica buono, dovresti

  • decidere se la portabilità è una preoccupazione (quindi utilizzare il modo classico)
  • decidere se la portabilità anche a Bash pre-4 è una preoccupazione (quindi utilizzare la modalità classica)
  • non importa quale syntax usi, non cambiarla all’interno dello stesso script (confusione!)

Se il tuo script inizia già con #!/bin/sh (non importa se inteso o no), allora la soluzione di Bash 4, e in generale qualsiasi codice specifico di Bash, non è la strada da percorrere.

Ricorda inoltre che Bash 4 &>> è solo una syntax più breve – non introduce alcuna nuova funzionalità o qualcosa di simile.

La syntax è (accanto ad altra syntax di reindirizzamento) qui descritta: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output

In Bash puoi inoltre specificare esplicitamente i tuoi reindirizzamenti su file diversi:

 cmd >log.out 2>log_error.out 

L’aggiunta sarebbe:

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

In Bash 4 (così come ZSH 4.3.11):

 cmd &>>outfile 

appena fuori dalla scatola

Questo dovrebbe funzionare bene:

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

Memorizzerà tutti i registri in file.txt e li scaricherà sul terminale.

Prova questo

 You_command 1>output.log 2>&1 

Il tuo uso di &> x.file funziona in bash4. perdonami per quello : (

Ecco alcuni suggerimenti aggiuntivi.

0, 1, 2 … 9 sono descrittori di file in bash.

0 sta per stdin , 1 sta per stdout , 2 sta per stderror . 3 ~ 9 è di riserva per qualsiasi altro utilizzo temporaneo.

Qualsiasi descrittore di file può essere reindirizzato ad altri descrittori di file o file utilizzando l’operatore > o >> (append).

Utilizzo: < file_descriptor >> < nomefile | & file_descriptor >

Si prega di fare riferimento a http://www.tldp.org/LDP/abs/html/io-redirection.html