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  

 

5 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
  2. NJ speeds legal sports betting: 7 top-rated casinos, 8
    The New 당진 출장샵 Jersey Lottery 속초 출장샵 said the SuperLotto Plus winner 구리 출장안마 will spend his Wednesday night playing a variety of lottery 광양 출장마사지 games. 의정부 출장마사지

    ResponderEliminar