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.