Redireccionando las salidas de nuestros programas en Linux

En Linux se tiene 3 maneras estandar de mostrar los flujos de información de entrada y salida, estos son los siguientes:
  • Entrada estandar (stdin – Standard Input): generalmente asociada al teclado. Esta representada con el número 0.
  • Salida estandar (stdout – Standard Output): usada para mostrar la salida, generalmente la salida por el monitor. Esta representada con el número 1.
  • Salida estandar de error (stderr – Standard Error): usada para mostrar los errores de la salida estandar. Esta representada con el número 2.
Se utilizan los siguientes simbolos para redireccionar la entrada/salida estandar:
Mayor que “>”: Redirige la salida estandar, tambien se puede utilizar de la forma 1>, aunque si se omite el numero 1, el valor por defecto de la salida es 1.  Menor que “<”: Redirige la entrada estandar.

Utilizar “>>” para redirigir la salida a un archivo ya existente sin sobreescribir su contenido.

Veamos algunos ejemplos para mayor entedimiento:
 1) Redireccionando la salida estandar “>”
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ who
johnny tty7 2012-04-02 13:41 (:0)
johnny pts/0 2012-04-02 13:41 (:0.0)
johnny pts/1 2012-04-02 14:32 (:0.0)
– Redirecciono la salida estandar a un archivo: usuario_conect.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$who >usuario_conect.txt
Nota: Si el archivo existe, se sobreescribe el contenido. Si queremos añadir la salida a un archivo ya existente utilizar >>.
– Listo el archivo
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat usuario_conect.txt
johnny tty7 2012-04-02 13:41 (:0)
johnny pts/0 2012-04-02 13:41 (:0.0)
johnny pts/1 2012-04-02 14:32 (:0.0)
– Añadiendo el resultado de la salida estandar al archivo “usuario_conect.txt”
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls >>usuario_conect.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat usuario_conect.txt
johnny tty7 2012-04-02 13:41 (:0)
johnny pts/0 2012-04-02 13:41 (:0.0)
johnny pts/1 2012-04-02 14:32 (:0.0)
archivo2
carpeta3
mi_lista
tmp.txt
tmp2.txt
tmpfile
usuario_conect.txt
2) Redireccionando la entrada estandar “<”
Un ejemplo sencillo que podemos ver, es contar la cantidad de lineas que posee el archivo lineas.txt”
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2/carpeta3$ wc -l < lineas.txt
34
3) Redireccionando el error estandar “2>”
  • La redireccion de stdout no afectara a stderr o stdin.
  • Los mensajes de error se muestran en stderr.
  • Para redireccionar el error (stderr) a un archivo lo realizamos con 2>.
  • La redireccion de stderr no afectara a stdout ni a stdin.
Veamos algunos ejemplos:
Voy a listar un archivo que no existe, de formar de producir un error, veamos lo que pasa.
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls dir
ls: cannot access dir: No such file or directory
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls dir > error .txt
ls: cannot access dir: No such file or directory
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat error .txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$
Vemos que el archivo error, no contiene nada (La redireccion de stdout no afectara a stderr ni a stdin) 
Ahora redireccionamos la salida de error al archivo error.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls dir 2> error.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat error.txt
ls: cannot access dir: No such file or directory
“Tambien podemos enviar añadir la salida de error a un archivo con 2>> ya existente sin necesidad de sobreescribirlo. Nota: si lo realizamos de la forma 2> y el archivo existe, se sobreescribe y si no existe lo genera.”
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls -l mi_casa 2>> error.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat error.txt
ls: cannot access dir: No such file or directory
ls: cannot access mi_casa: No such file or directory
Existe un archivo especial llamado /dev/null para deshacerse de datos indeseados.
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls -l dir 2> /dev/null
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$
La sentencia anterior indica que si el archivo listado no existe, que no muestre el error y se deshaga del mismo.
4) Redireccionando tanto salida estandar (stdout) como error estandar (stderr) a un solo archivo “&> ó 2>&1”
Con la forma &> podemos enviar tanto el stdout como el stderr a un solo archivo.
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls -l aa &> secuencia.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat secuencia.txt
ls: cannot access aa: No such file or directory
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls -l aa &>> secuencia.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat secuencia.txt
ls: cannot access aa: No such file or directory
ls: cannot access aa: No such file or directory
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls -l &>> secuencia.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat secuencia.txt
ls: cannot access aa: No such file or directory
ls: cannot access aa: No such file or directory
total 36
-rw-r–r– 1 johnny johnny 0 Mar 11 12:32 archivo2
drwxrwxrwx 2 johnny johnny 4096 Apr 2 17:28 carpeta3
-rw-r–r– 1 johnny johnny 102 Apr 2 17:58 error.txt
-rw-r–r– 1 johnny johnny 2547 Mar 14 00:15 mi_lista
-rw-r–r– 1 johnny johnny 566 Apr 2 18:06 registro.txt
-rw-r–r– 1 johnny johnny 102 Apr 2 18:28 secuencia.txt
-rw-r–r– 1 johnny johnny 482 Mar 14 00:41 tmp.txt
-rw-r–r– 1 johnny johnny 346 Mar 14 00:39 tmp2.txt
-rw-r–r– 1 johnny johnny 346 Mar 14 00:35 tmpfile
-rw-r–r– 1 johnny johnny 211 Apr 2 17:12 usuario_conect.txt

Una forma muy usada de listar tanto la salida estandar como la salida de un error a un solo archivo es la siguiente. 2>&1, la cual desvia la salida estándar de errores a la salida estándar, de esta manera podemos tener un archivo en donde se guarden tanto la salida exitosa como la de error de algun srcript en un solo archivo

johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls -l > registro.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat registro.txt
total 28
-rw-r–r– 1 johnny johnny 0 Mar 11 12:32 archivo2
drwxrwxrwx 2 johnny johnny 4096 Apr 2 17:28 carpeta3
-rw-r–r– 1 johnny johnny 102 Apr 2 17:58 error.txt
-rw-r–r– 1 johnny johnny 2547 Mar 14 00:15 mi_lista
-rw-r–r– 1 johnny johnny 0 Apr 2 18:00 registro.txt
-rw-r–r– 1 johnny johnny 482 Mar 14 00:41 tmp.txt
-rw-r–r– 1 johnny johnny 346 Mar 14 00:39 tmp2.txt
-rw-r–r– 1 johnny johnny 346 Mar 14 00:35 tmpfile
-rw-r–r– 1 johnny johnny 211 Apr 2 17:12 usuario_conect.txt
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ ls -l noexiste >> registro.txt 2>&1
johnny@debianJG:~/Documents/pruebas/carpeta1/carpeta2$ cat registro.txt
total 28
-rw-r–r– 1 johnny johnny 0 Mar 11 12:32 archivo2
drwxrwxrwx 2 johnny johnny 4096 Apr 2 17:28 carpeta3
-rw-r–r– 1 johnny johnny 102 Apr 2 17:58 error.txt
-rw-r–r– 1 johnny johnny 2547 Mar 14 00:15 mi_lista
-rw-r–r– 1 johnny johnny 0 Apr 2 18:00 registro.txt
-rw-r–r– 1 johnny johnny 482 Mar 14 00:41 tmp.txt
-rw-r–r– 1 johnny johnny 346 Mar 14 00:39 tmp2.txt
-rw-r–r– 1 johnny johnny 346 Mar 14 00:35 tmpfile
-rw-r–r– 1 johnny johnny 211 Apr 2 17:12 usuario_conect.txt
ls: cannot access noexiste: No such file or directory

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s