Cómo redirigir y agregar tanto la salida estándar como el error estándar a un archivo con Bash

Resuelto flybywire asked hace 15 años • 9 respuestas

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.txtno funcionó para mí.

flybywire avatar May 18 '09 11:05 flybywire
Aceptado
cmd >>file.txt 2>&1

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

  1. >>file.txt: Abrir file.txten modo agregar y redirigir stdoutallí.
  2. 2>&1: Redirigir stderra "hacia dónde stdoutse dirige actualmente" . En este caso, se trata de un archivo abierto en modo agregar. En otras palabras, &1reutiliza el descriptor de archivo que stdoututiliza actualmente.
Alex Martelli avatar May 18 '2009 04:05 Alex Martelli

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 .

TheBonsai avatar May 18 '2009 04:05 TheBonsai

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
Aaron R. avatar Jul 24 '2013 18:07 Aaron R.