¿Cómo puedo redirigir y anexar stdout y stderr a un archivo con Bash?

Para redirigir stdout a un archivo truncado en Bash, sé usar:

cmd > file.txt 

Para redirigir la salida estándar en Bash, anexando a un archivo, sé que debo usar:

 cmd >> file.txt 

Para redirigir stdout y stderr a un archivo truncado, sé usar:

 cmd &> file.txt 

¿Cómo redirecciono tanto stdout como stderr anexando a un archivo? cmd &>> file.txt no funcionó para mí.

 cmd >>file.txt 2>&1 

Bash ejecuta los redireccionamientos de izquierda a derecha de la siguiente manera:

  1. >>file.txt : abra file.txt en el modo de adición y redireccione stdout allí.
  2. 2>&1 : Redirige stderr a “donde stdout está actualmente en curso” . En este caso, ese es un archivo abierto en el modo de agregar. En otras palabras, el &1 reutiliza el descriptor de archivo que stdout usa actualmente.

Hay dos formas de hacerlo, dependiendo de tu versión de Bash.

La forma clásica y portátil ( Bash pre-4 ) es:

 cmd >> outfile 2>&1 

Una forma no portátil, comenzando con Bash 4 es

 cmd &>> outfile 

(análogo a &> outfile )

Para un buen estilo de encoding, deberías

  • decida si la portabilidad es una preocupación (luego use la forma clásica)
  • decida si la portabilidad incluso para Bash pre-4 es una preocupación (luego use la forma clásica)
  • no importa qué syntax use, no la cambie dentro del mismo script (¡confusión!)

Si su secuencia de comandos ya comienza con #!/bin/sh (no importa si está previsto o no), entonces la solución Bash 4, y en general cualquier código específico de Bash, no es el camino a seguir.

También recuerde que Bash 4 &>> es una syntax más corta, no presenta ninguna funcionalidad nueva ni nada por el estilo.

La syntax es (junto a otra syntax de redirección) que se describe aquí: http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output

En Bash también puede especificar explícitamente sus redireccionamientos a diferentes archivos:

 cmd >log.out 2>log_error.out 

Anexar sería:

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

En Bash 4 (así como en ZSH 4.3.11):

 cmd &>>outfile 

recién salido de la caja

Esto debería funcionar bien:

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

Almacenará todos los registros en file.txt así como los volcará en el terminal.

Prueba esto

 You_command 1>output.log 2>&1 

El uso de &> x.file funciona en bash4. lo siento por eso : (

Aquí viene algunos consejos adicionales.

0, 1, 2 … 9 son descriptores de archivos en bash.

0 significa stdin , 1 significa stdout , 2 significa stderror . 3 ~ 9 es repuesto para cualquier otro uso temporal.

Cualquier descriptor de archivo puede ser redirigido a otro descriptor de archivo o archivo usando operator > o >> (append).

Uso: < file_descriptor >> < nombre de archivo | & file_descriptor >

Por favor, consulte http://www.tldp.org/LDP/abs/html/io-redirection.html