Cómo redirigir y agregar tanto la salida estándar como el error estándar a un archivo con Bash
Para redirigir la salida estándar a un archivo truncado en Bash, sé usar:
cmd > file.txt
Para redirigir la salida estándar en Bash, agregándola a un archivo, sé usar:
cmd >> file.txt
Para redirigir tanto la salida estándar como el error estándar a un archivo truncado, sé usar:
cmd &> file.txt
¿Cómo redirijo tanto la salida estándar como el error estándar agregado a un archivo? cmd &>> file.txt
no funcionó para mí.
cmd >>file.txt 2>&1
Bash ejecuta las redirecciones de izquierda a derecha de la siguiente manera:
>>file.txt
: Abrirfile.txt
en modo agregar y redirigirstdout
allí.2>&1
: Redirigirstderr
a "hacia dóndestdout
se dirige actualmente" . En este caso, se trata de un archivo abierto en modo agregar. En otras palabras,&1
reutiliza el descriptor de archivo questdout
utiliza actualmente.
Hay dos formas de hacer esto, según su 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 codificación, debes
- Decida si la portabilidad es un problema (luego use la forma clásica)
- decida si la portabilidad incluso a Bash pre-4 es una preocupación (luego use la forma clásica)
- no importa qué sintaxis uses, no la cambies dentro del mismo script (¡confusión!)
Si su script ya comienza con #!/bin/sh
(sin importar si es intencionado o no), entonces la solución Bash 4 y, en general, cualquier código específico de Bash, no es el camino a seguir.
Recuerde también que Bash 4 &>>
tiene una sintaxis más corta: no introduce ninguna funcionalidad nueva ni nada por el estilo.
La sintaxis se describe (junto con otras sintaxis de redirección) en la wiki de hackers de Bash .
En Bash también puedes especificar explícitamente tus redirecciones a diferentes archivos:
cmd >log.out 2>log_error.out
Agregar sería:
cmd >>log.out 2>>log_error.out