Hackers use Bash IV – I/O Redirections (Entradas/Salidas) & Pipes

Colaborador: Hackbier

Las redirecciones de Entrada/Salida (I/O Redirections) es una de las cosas más fáciles de aprender, dando a su vez una gran utilidad y potencia a la hora de la programación en Bash o la vida cotidiana del uso de la shell. En Unix, GNU/Linux o Bash cada programa o script tiene una entrada (el teclado, a menudo en forma de comando), una salida (generalmente la consola) y una salida de error.

 

Nombre Descriptor de fichero
Entrada estándar (stdin) 0
Salida estándar (stdout) 1
Error estándar (stderr) 2

Esto es una entrada y salida estándar y común, pero Bash nos permite jugar con las mismas. Unix dispone de un gran número de comandos que leen de la entrada estándar, realizan una operación con el texto, y escriben en la salida estándar o en la salida de errores si se produce un error, de entre los que destacamos cat, grep, sed

Para poder jugar y editar la Entrada/Salida es necesaria la utilización de la siguiente sintáxis:

i. comando < fichero

Toma la entrada del fichero para ser recibida por el comando. Un ejemplo claro es el uso del comando cat, donde cat fichero es igual a cat < fichero. De esta forma cat toma como entrada el fichero indicado y, en este caso, sería mostrado por pantalla su contenido.

ii. comando > fichero

Toma la salida del comando y la envía al fichero. En caso de existir machaca el contenido del mismo. Siendo de esta forma ifconfig lo > fichero un buen ejemplo de este uso, donde el contenido de ifconfig no tendrá una salida estándar por pantalla, sino el contenido será añadido al fichero indicado. Después podemos volver a realiar el comando del punto i para comprobarlo.

Otros ejemplos pueden ser la utilización de echo «Sobreescribiendo texto» > fichero, lo que crearía un fichero de texto con ese mensaje impreso; en caso de existir el fichero sería sobrescrito su contenido por este nuevo.

También podemos utilizar estos operadores sin comando, por ejemplo utilizando > fichero, lo que crearía el fichero vacío.

 

iii. comando 2> fichero

Envía la salida de error que pueda devolver el comando al fichero. Por ejemplo, la orden ls ficheroQueNoExiste 2> fichero enviará el error -forzado- que devolvería al fichero en cuestión. Esto puede ser útil en la realización de scripts para llevar un control de errores.

 

iv. comando >> fichero

Añade al final del fichero el contenido del comando, sin sobreescribir el contenido del mismo. De esta forma podemos completar el ejemplo de echo del punto ii. Donde cambiando el operador > por >> evitaremos que el contenido sea sobreescrito.

 

v. comando << clave

Obtiene el contenido de las siguientes líneas hasta encontrar la palabra clave indicada en la orden. Con el comando de ejemplo cat << fin nos devolverá un prompt para escribir y finalizará cuando la palabra fin sea escrita. Si le añadimos cat << fin > fichero el contenido creado se escribirá en el fichero. De esta forma observamos como es posible combinar varios operadores.

 

vi. comando 2>&1

Envía la salida de error a la salida estándar. Por ejemplo, usando el comando ls -l /bin/bash directorioQueNoExiste/ 2>&1 devolverá por salida estándar tanto las salidas como los errores. Esta acción no tiene mucho sentido, ya que ocurre lo mismo en el caso de no utilizar ningún operador. Para darle sentido y utilidad, podríamos añadirle una salida no estándar, por ejemplo ls -l /bin/bash directorioQueNoExiste/ > fichero 2>&1.

 

vii. comando &> fichero

Envía la salida estándar y de error al fichero. Es algo similar a utilizar comando > fichero 2>&1. Exactamente que el comando anteriormente utilizado ls -l /bin/bash directorioQueNoExiste/ > fichero 2>&1 podemos sustituirlo por ls -l /bin/bash directorioQueNoExiste &> fichero, lo que simplificaría la orden.

 

Pipes

Bash permite redirigir la salida estándar de un programa a la entrada estándarde otro programa. Esto se cosigue utilizando el operador |, denominado pipeline. Esto es conocido como pipes. Para ello se utiliza la siguiente sintaxis:

 

viii. comando  (1) | comando (2)

La forma más basica. La salida del comando (1) pasará a ser la entrada del comando (2). Un uso muy típico para este ejemplo es la utilidad more que mostrará por páginas la información. Si utilizamos un comando o programa que devuelva una salida extensa veremos su funcionamiento de forma muy gráfica, por ejemplo el programa tree, que muestra el árbol de directorios. El ejemplo sería tree / | more, donde la salida de tree pasaría a ser la entrada de more. Por supuesto podremos combinar todos los pipes que queramos.