Llegó el momento de hablar del maravilloso mundo de las redirecciones. Las redirecciones es una de las características más importantes proporcionadas por la shell.

Por redirección se entiende como la posibilidad de redireccionar la visualización de la pantalla hacía un fichero, una impresora o cualquier otro periférico, los mensajes de errores hacía otro archivo, de sustituir la introducción vía teclado por el contenido de un fichero.

Cualquier flujo de datos en entrada o salida para por un canal. En GNU/Linux -como en la mayoría de Unix- estos canales son de entrada/salida (input/ouput) y se utilizan para leer y escribir datos.

Por defecto, el canal de entrada será siempre el teclado y el canal de salida será siempre la pantalla. Aún así, es posible redireccionar estos dos canales hacía un fichero de manera transparente para los comandos de GNU/Linux.

De salida

Para redireccionar la salida estándar -la que se muestra por pantalla- se suele utilizar el carácter >

$ ls -l > salida
$ cat salida 
total 4
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 fichero
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 pass
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 readme
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:57 salida
drwxrwxr-x 2 t3rr0rz0n3 t3rr0rz0n3 4096 set 23 18:55 test

Si no existe el fichero salida lo creará antes de ejecutar el comando. Si ya existe el fichero, se sobreescribirá todo su contenido -incluso si el comando es erróneo-.

Para añadir datos a continuación del fichero, deberemos de utilizar la doble redirección >>:

$ echo "texto al final" >> salida
$ cat salida 
total 4
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 fichero
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 pass
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 readme
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:57 salida
drwxrwxr-x 2 t3rr0rz0n3 t3rr0rz0n3 4096 set 23 18:55 test
texto al final

En entrada

Los comandos que esperan datos o parámetros desde el teclado también pueden recibirlos con una redirección de entrada utilizando el carácter <, un ejemplo es el comando wc, que permite contar el número de líneas, de palabras y de caracteres de un archivo.

$ wc < salida
  7  50 320

Los canales estándares

Se puede considerar un canal como un archivo que posee su propio descriptor por defecto, y en el cual se puede leer o escribir:

  • El canal de entrada estándar se llama stdin y lleva el descriptor 0.
  • El canal de salida estándar se llama stdout y lleva el descriptor 1.
  • El canal de error estándar se llama stderr y lleva el descriptor 2.

Por ejemplo, podemos redireccionar el canal de error a un fichero:

$ rm noexiste.txt
rm: no se ha podido eliminar 'noexiste.txt': El fichero o directorio no existe
$ rm noexiste.txt 2> error.log
$ cat error.log 
rm: no se ha podido eliminar 'noexiste.txt': El fichero o directorio no existe

Y también se pueden anidar diferentes redirecciones:

ls -l > resultado 2>&1

En este caso se redirecciona la salida 2 hacía la salida 1. Por lo tanto, los mensajes de error pasaran por la salida estándar. Luego se redirecciona el resultado de la salida estándar al comando ls hacía el archivo resultado.

Apertura de canales

Por lo general existen tres canales estándares y se enumeran de 0 a 2. Así 0< equivale a < y 1> a >. Con el comando exec permite abrir otros siete canales numerados de 3 a 9. Por lo tanto hay diez canales en total.

Por lo tanto, podemos abrir un canal nuevo y sacar algunos resultados por el canal 3 y otros resultados por el canal 4 y así sucesivamente. Todos los canales están abiertos para la entrada y salida.

$ exec 3>dump.log
$ cat dump.log 

$ ls -l >&3
$ cat dump.log 
total 4
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 fichero
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 pass
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:55 readme
-rw-rw-r-- 1 t3rr0rz0n3 t3rr0rz0n3    0 set 23 18:57 salida
drwxrwxr-x 2 t3rr0rz0n3 t3rr0rz0n3 4096 set 23 18:55 test
texto al final

Y eso es todo!

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación