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


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

cmd > file.txt

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

cmd >> file.txt

Para redirigir tanto stdout como stderr a un archivo truncado, sé que debo usar:

cmd &> file.txt

¿Cómo puedo redirigir tanto stdout y stderr anexar a un archivo? cmd &>> file.txt no funcionó para mí.

Author: Jahid, 2009-05-18

6 answers

cmd >>file.txt 2>&1

Bash ejecuta las redirecciones de izquierda a derecha de la siguiente manera:

  1. >>file.txt: Abre file.txt en modo anexar y redirige stdout allí.
  2. 2>&1: Redirige stderr a "donde stdout va actualmente". En este caso, es un archivo abierto en modo anexar. En otras palabras, el &1 reutiliza el descriptor de archivo que stdout utiliza actualmente.
 1607
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-09 14:55:58

Hay dos maneras de hacer esto, dependiendo de su versión Bash.

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

cmd >> outfile 2>&1

Una vía no portable, empezando por Bash 4 es

cmd &>> outfile

(análogo a &> outfile)

Para un buen estilo de codificación, debe

  • decida si la portabilidad es una preocupación (luego use la forma clásica)
  • decidir si la portabilidad incluso a Bash pre-4 es una preocupación (a continuación, utilizar la forma clásica)
  • no importa qué sintaxis uses, no cambiarlo dentro del mismo script (confusión!)

Si su script 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 simplemente una sintaxis más corta - no introduce ninguna funcionalidad nueva ni nada por el estilo.

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

 303
Author: TheBonsai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-23 11:24:34

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

cmd >log.out 2>log_error.out

Anexando sería:

cmd >>log.out 2>>log_error.out
 76
Author: Aaron R.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-11 15:39:21

En Bash 4 (así como ZSH 4.3.11):

cmd &>>outfile

Recién salido de la caja

 57
Author: A B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-20 08:47:00

Esto debería funcionar bien:

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

Almacenará todos los registros en el archivo .txt así como volcarlos en la terminal.

 36
Author: Pradeep Goswami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-03 18:35:42

Prueba esto

You_command 1>output.log  2>&1

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

Aquí vienen algunos consejos adicionales.

0, 1, 2...9 son descriptores de archivo 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 el operador > o >> (anexar).

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

Consulte http://www.tldp.org/LDP/abs/html/io-redirection.html

 20
Author: Quintus.Zhou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-10 03:47:29