martes, 24 de abril de 2012

Redirecciones en Linux (Entradas, Salidas y Error estandar)


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  

 

4 comentarios:

  1. Llevaba una semana atascada en un curso porque en mis apuntes no entendía esto... todavía no le veo el fin a redireccionar los errores pero supongo que mas adelante si.
    Al menos ya lo entiendo!!! Gracias!!

    ResponderEliminar
    Respuestas
    1. Gracias por comentar, espero te haya servido para aclarar tus dudas.

      Eliminar