3.9. Fontanerı́a GNU/Linux 113 3.9. Fontanerı́a GNU/Linux 3.9.1. Entrada y salida estándar. Muchas instrucciones de GNU/Linux toman la entrada de lo que se llama standard input y mandan su salida a standard output (a menudo abreviados como stdin y stdout). El intérprete de órdenes arregla las cosas de forma que la entrada estándar es su teclado y la salida estándar es la pantalla. He aquı́ un ejemplo en el que se usa la orden cat. Normalmente, cat lee datos de todos los datos especificados por la lı́nea de órdenes y manda estos datos directamente a stdout. Por tanto usando la orden /home/larry/papers# cat history-final masters-thesis se muestra el contenido del fichero history-final seguido por masters-thesis. Sin embargo, si no especifica un nombre de fichero, cat lee datos de stdin y los devuelve a stdout. Aquı́ hay un ejemplo: /home/larry/papers# cat Hello there. Hello there. Bye. Bye. Ctrl-D /home/larry/papers# Cada lı́nea que escriba será repetida inmediatamente por cat. Cuando se lee de la entrada estándar, se le indica que la entrada ha ”finalizado”enviando una señal EOT (end-of-text , final de texto), que se genera pulsando Ctrl-D . He aquı́ otro ejemplo. La orden sort lee lı́neas de texto (de nuevo, de stdin, a no ser que le especifique uno o más nombres de ficheros) y manda la salida ordenada a stdout. Pruebe lo siguiente. /home/larry/papers# sort bananas zanahorias manzanas Ctrl-D bananas manzanas zanahorias /home/larry/papers# Ahora ya podemos ordenar por orden alfabético la lista de la compra, ¿verdad que GNU/Linux es útil? 3.9.2. Redireción de la entrada y la salida Ahora, digamos que quiere mandar la salida de sort a un fichero, para guardar nuestra lista de la compra en el disco. El intérprete de órdenes le permite redirecionar la salida estándar a un nombre de fichero, usando el sı́mbolo “>”. Aquı́ está cómo funciona: /home/larry/papers# sort > listacompra bananas zanahorias manzanas Ctrl-D /home/larry/papers# Como puede ver, el resultado de la orden sort no se visualiza, pero se guarda en el fichero llamado listacompra. Veamos este fichero: 114 Tutorial de GNU/Linux /home/larry/papers# cat listacompra bananas manzanas zanahorias /home/larry/papers# Ahora puede ordenar su lista de la compra ¡y guardarla también!. Pero supongamos que está guardando la lista de la compra original sin ordenar en el fichero items. Un modo de ordenar la información y guardarla en un fichero serı́a darle a sort el nombre del fichero a ser leı́do, en lugar de la entrada estándar, y redireccionar la salida estándar como lo hicimos arriba, como sigue: /home/larry/papers# sort items > listacompra /home/larry/papers# cat listacompra bananas manzanas zanahorias /home/larry/papers# Sin embargo, hay otra forma de hacer ésto. No sólo puede redireccionar la salida estándar, también puede redireccionar la entrada estándar, usando el sı́mbolo “<”. /home/larry/papers# sort < items bananas manzanas zanahorias /home/larry/papers# Técnicamente, sort < items es equivalente a sort items, pero vamos a demostrar lo siguiente: sort < items se comporta como si los datos del fichero items fueran tecleados a la entrada estándar. El intérprete de órdenes maneja el redireccionamiento. sort no se le dió el nombre del fichero (items) a leer; en lo que concierne a sort, él todavı́a lee de la entrada estándar como si hubiera tecleado los datos desde su teclado. Esto introduce el concepto de filtro. Un filtro es un programa que lee datos de la entrada estándar, los procesa de alguna forma, y manda los datos procesados a la salida estándar. Usando la redirección, la entrada y salida estándar pueden ser referenciadas desde ficheros. Como se mencionó más arriba stdin y stdout son por omisión el teclado y la pantalla respectivamente. El programa sort es un filtro simple. Ordena los datos entrantes y manda el resultado a la salida estándar. Más sencillo aún es cat. No hace nada con los datos entrantes, sólo devuelve todo lo que se le entrega. 3.9.3. Uso de tuberı́as Ya mostramos como usar sort como un filtro. Sin embargo, estos ejemplos dan por hecho que usted tiene los datos guardados en alguna parte o que tecleará los datos desde la entrada estándar. ¿Qué pasa si los datos que quiere ordenar vienen de la salida de otro programa, como ls? La opción -r de sort ordena los datos en orden alfabético inverso. Si quiere listar los ficheros de su directorio actual en orden inverso una forma de hacerlo es como sigue: /home/larry/papers# ls english-list history-final masters-thesis notes Ahora el redireccionamiento d la orden ls a un fichero llamado file-list: Fontanerı́a GNU/Linux 115 /home/larry/papers# ls > file-list /home/larry/papers# sort -r file-list notes masters-thesis history-final english-list /home/larry/papers# Aquı́, usted guarda la salida de un ls en un fichero, y luego ejecuta sort -r con ese fichero. Pero esto es incómodo y usa un fichero temporal para guardar los datos de ls. La solución es la canalización9 . Ésta es una posibilidad del intérprete de órdenes, que conecta una serie de órdenes mediante una “tuberı́a.” La stdout del primer programa se envı́a a la stdin del segundo programa. En este caso, queremos enviar la stdout de ls a la stdin de sort. Se utiliza el sı́mbolo “|” para crear una tuberı́a, como sigue: /home/larry/papers# ls | sort -r notes masters-thesis history-final english-list /home/larry/papers# Este programa es más corto y más fácil de teclear. He aquı́ otro útil ejemplo, la orden /home/larry/papers# ls /usr/bin muestra una lista larga de ficheros, la mayorı́a de los cuáles salen de la pantalla demasiado rápido como para que lo pueda leer. Ası́ que, usamos more para mostrar la lista de ficheros de /usr/bin. /home/larry/papers# ls /usr/bin | more Ahora ya puede paginar las lista de ficheros cómodamente. ¡Pero lo mejor no termina aquı́! Puede hacer canalizaciones entre más de dos programas juntos. El programa head es un filtro que muestra las primeras lı́neas de un flujo entrante (en este caso, entrada de una canalización). Si quiere mostrar los últimos nombres de fichero en orden alfabético del directorio actual, use estas órdenes: /home/larry/papers# ls | sort -r | head -1 notes /home/larry/papers# donde head -1 muestra la primera lı́nea de entrada que recibe (en este caso, el flujo de datos ordenados inversamente de ls). 3.9.4. Redirección no destructiva de la salida Usar “>” para redireccionar la salida a un fichero es destructivo: en otras palabras, la orden: /home/larry/papers# ls > file-list sobreescribe el contenido del fichero file-list. Si en su lugar, redirecciona con el sı́mbolo “>>”, la salida será concatenada al final del fichero, en vez de sobreescribirlo. Por ejemplo, /home/larry/papers# ls >> file-list añade la salida de la orden ls a file-list. Tenga presente que el redireccionamiento y las canalizaciones son caracterı́sticas del intérprete de órdenes —que da soporte al uso de “>”, “>>” y “|”. No tiene nada que ver con las órdenes propiamente dichas. 9 N. del T.: pipelining