sábado, 23 de noviembre de 2013

Redirección de comandos

Resto de entradas con intenciones didácticas en la etiqueta Aprendizaje.

Hoy vamos a conocer como redireccionar el resultado de un comando hacia la pantalla o hacia un archivo. Se emplean unos caracteres llamados operadores de redirección o redireccionadores para enviar el resultante de la ejecución de un comando al lugar donde nos interesa tenerlo.

Lo primero a tener claro es que los procesos en GNU/Linux tienen asociados tres archivos ubicados en el directorio /dev y denominados:

/dev/stdin o entrada estándar
/dev/stdout o salida estándar
/dev/stderr o salida de errores

La entrada estándar o stdin es el lugar desde donde un comando obtiene la información a procesar, y por defecto es el teclado.

La salida estándar o stdout es el lugar donde un comando envía el resultado de su ejecución, y por defecto es la pantalla del terminal.

La salida de errores o stderr es el lugar donde un comando envía un mensaje de error en caso de que se produzca; por defecto es la pantalla pero también puede ser un archivo.

Cada uno de estos tres archivos lleva también asociado un número descriptor:

stdin - 0
stdout - 1
stderr - 2

Luego están los operadores, que son los símbolos < y >. Con estos caracteres realizaremos la operativa de redirección. Resumiendolo en una tabla:
  1. stdin  -  entrada estándar (teclado)  - Descriptor: 0  - Operador: <
  2. stdout  -  salida estándar (terminal)  - Descriptor: 1  - Operador: >
  3. stderr  - salida de errores (pantalla o archivo)  - Descriptor: 2  -  Operador: >
Para entender todo esto lo mejor es verlo con ejemplos.

Imaginemos que queremos enviar la salida de un comando a un fichero para verlo con posterioridad, por ejemplo, el listado del contenido de nuestro directorio actual (comando ls -l) al archivo lista.txt. Lo haríamos así:
1) De salida estándar stdout (pantalla) a archivo -1er caso-: ls -l > lista.txt
Así, en lugar que ver el resultado del comando ls -l por pantalla obtendríamos un archivo llamado lista.txt en el que aparece el contenido de nuestro directorio actual según los términos del comando ls -l. Si este archivo ya existiera lo sobreescribiría. Veamos más ejemplos.
2) De salida estándar stdout (pantalla) a archivo -2º caso-: ls -l >> lista.txt
En este caso el redireccionador es >> y lo que conseguimos con él es añadir el resultado del comando ls -l al archivo lista.txt ya existente. Podemos así añadir contenido al archivo repetidas veces si no queremos crear uno nuevo cada vez o machacar el ya existente.
3) De error estándar stderr a archivo (1er caso): ls -l 2> errores.txt
Habrá ocasiones en que un comando nos de error al ejecutarse, total o parcialmente, y en esa ocasión quizá sea útil ver pausadamente en qué consiste ese error. Para eso está la salida de errores y lo más común es derivarla a un archivo, en este caso errores.txt. Recuerden que si ya existe lo sobreescribirá. Si no se produce ningún error el archivo se creará sin contenido alguno. No saldrá nada por pantalla.
4) De error estándar stderr a a archivo (2º caso)ls -l 2>> errores.txt
Mismo caso que el que vimos más arriba; si el redireccionador es doble lo que hacemos es añadir contenido al archivo de errores designado (que sigue siendo errores.txt). Tampoco saldrá nada por pantalla.
5) De error estándar stderr a la salida estándar stdout (pantalla): cp * 2>&1
En esta ocasión usando los descriptores hemos redireccionado la salida de error del comando cp * (copiar todo) a la salida estándar (la pantalla) mediante el carácter &. De esta forma si no es posible copiar todo lo designado con el comando cp por el motivo que sea (como puede ser no tener privilegios para hacerlo) los mensajes de error serán visualizados por la salida estándar (pantalla).
6) De un archivo al comando por la entrada estándar stdin (teclado): grep "López" < empleados.txt
Aquí hemos empleado el comando grep, el cual sirve para filtrar resultados en función del parámetro introducido, que ha sido "López". De este modo, dentro de un hipotético archivo llamado empleados.txt se han buscado todas las líneas de texto que contengan "López" y el resultado de esta búsqueda se ha enviado a la salida estándar (pantalla). Dicho de otro modo, el resultado de la búsqueda se emplea como entrada del comando grep y el resultado de su ejecución lo vemos por la pantalla.
7) De error estándar stderr a dispositivo nulo: ls -l 2> /dev/null
De esta forma los errores producidos al ejecutar el comando ls -l irán a un dispositivo nulo y se perderán.
8) De salida estándar stdout a dispositivo nulo: ls -l > /dev/null
No hay mucho más que explicar de este caso: el comando se ejecuta y su resultado se pierde por el agujero negro de la salida nula.

Como siempre digo, conviene consultar toda la documentación que cada uno tenga a mano para completar y terminar de entender el concepto de redirección. Y practicar, practicar mucho.

Parece que la ocasión la pintan calva para engarzar un vídeo de One Direction, ¿verdad? Pues lo siento, se van a quedar con las ganas. Ahí tienen a la extinta formación post-metalera Isis que, digamos, transitaron por senderos ligeramente dispares.