¿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í.
6 answers
cmd >>file.txt 2>&1
Bash ejecuta las redirecciones de izquierda a derecha de la siguiente manera:
-
>>file.txt
: Abrefile.txt
en modo anexar y redirigestdout
allí. -
2>&1
: Redirigestderr
a "dondestdout
va actualmente". En este caso, es un archivo abierto en modo anexar. En otras palabras, el&1
reutiliza el descriptor de archivo questdout
utiliza actualmente.
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
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
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
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.
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
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