Redirigir las salidas STDOUT y STDERR

En Linux, los comandos que ejecutamos envían su salida a los flujos estándares (standard streams): STDOUT (1) y STDERR (2). Podemos redirigirlos hacia

  • un archivo
  • el otro flujo de datos: se indica con el número correspondiente precedido por &

Redirigir STDOUT

Comando [1]> <DESTINO>

lo que nos indica que podemos optar por indicar 1, dado que STDOUT es el flujo por defecto si no se especifica ninguno.

Ejemplo:

$ ls -la > listado.txt

Guardar la lista de elementos del directorio actual dentro de listado.txt

$ ./backup.pl 1> backup.log

Ejecutar el script backup.pl y el resultado de la ejecución guardarlo en el archivo de log.

Redirigir STDERR

Comando 2> <DESTINO>

Ejemplo:

$ grep Contenido * 2> errores.txt

Buscar el texto “Contenido” dentro de todos los archivos del directorio actual y los errores guardarlos en el archivo de texto.

$ grep Contenido * 2>&1 | sort

Buscar el texto “Contenido” dentro de todos los archivos del directorio actual y enviar los errores a la salida estándar, para que todo sea procesado por el comando sort.

Redirigir ambos a un mismo archivo

Comando [1]> <ARCHIVO>  2>&1

Ejemplo:

$ grep Contenido * > salida_completa.txt 2>&1

Buscar el texto “Contenido” dentro de todos los archivos del directorio actual y enviar los errores a la salida estándar, y la salida estándar al archivo salida_completa.txt (ambas salidas van al mismo archivo).

Descartar la salida de un comando

Para suprimir completamente la salida de un comando debemos redirigir ambas salidas a /dev/null (un dispositivo que descarta todo el contenido que en él se escriba):

$ ./reports.pl > /dev/null 2>&1

Con esto logramos que se ejecute el script reportes.pl pero que tanto su STDOUT como su STDERR se descarten (porque no interesan).

Basado en:

http://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout

http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/

Anuncios

Flujos estándares en Linux: STDIN, STDOUT y STDERR

En Linux, todo comando tiene disponibles los siguientes 3 descriptores: STDIN, STDOUT y STDERR.

Consideraciones generales de STDIN, STDOUT y STDERR

  • Estos flujos también tienen un número asociado: STDIN es 0, STDOUT es 1 y STDERR es 2.
  • Cuando no se especifica ninguno, se considera que se trata de STDOUT.

STDOUT (Standard Output)

La salida estándar es hacia donde el comando envía su salida. Este flujo de datos se imprime en la consola y se envía al STDIN de un comando que lo consuma

Ejemplo: En un directorio tenemos 2 archivos y el contenido de 1 de ellos es “Contenido del archivo”.

Si buscamos “Contenido” dentro de ellos obtenemos:

$ grep Contenido *

file1.txt:Contenido del archivo

La salida del comando se envió al STDOUT, en este caso, la consola.

STDIN (Standard Input)

La entrada estándar proviene del teclado o de la salida de otro comando.

Ejemplo:

Si listamos solamente los primeros 4 directorios o archivos del directorio raíz:

$ ls / | head -n4

bin
boot
cdrom
dev

La salida STDOUT del comando ls se convierte en la STDIN del comando head y lo que vemos en la consola es el STDOUT del comando HEAD

STDERR (Standard Error)

La salida estándar de error es hacia donde el comando envía datos de error al momento de realizar su tarea. Este flujo de datos también se imprime en la consola pero NO se envía al STDIN de un comando que lo consuma.

Ejemplo: En un directorio tenemos 4 archivos cuyo contenido es “Contenido del archivo” y sobre 2 de ellos no tenemos permiso de lectura.

a) Si buscamos “Contenido” dentro de todos ellos obtenemos:

$ grep Contenido *

file1.txt:Contenido del archivo
file2.txt:Contenido del archivo
grep: file3.txt: Permiso denegado
grep: file4.txt: Permiso denegado

Las primeras 2 líneas corresponden a lo que se envió a STDOUT y las otras 2, a STDERR. En este caso, todo se imprime en la consola.

b) Si buscamos “Contenido” dentro de todos ellos y generamos un archivo con los que hayamos encontrado:

$ grep Contenido * | cat > encontrados.txt

grep: file3.txt: Permiso denegado
grep: file4.txt: Permiso denegado

Del comando grep, solo veremos en la consola lo que se envió al STDERR dado que el STDOUT se utilizó como STDIN del comando cat.

$ cat encontrados.txt

file1.txt:Contenido del archivo
file2.txt:Contenido del archivo

Viendo el contenido del archivo encontrados.txt podemos notar que solamente contiene la salida STDOUT del comando grep.

 

Basado en:

http://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout

http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/