3.9. Fontanerıa GNU/Linux

Anuncio
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
Descargar