ant

REDIRECCIONES
3.8

sig

3.8.1 Entrada y Salida Estandar

Muchos comandos UNIX toman su entrada de algo conocido como entrada estandar y envían su salida a la salida estandar (a menudo abreviado como "stdin" y "stdout"). El intérprete de comandos configura el sistema de forma que la entrada estándar es el teclado y la salida la pantalla.

Veamos un ejemplo con el comando cat.
Normalmente cat lee datos de los ficheros cuyos nombres se pasan como argumentos en la linea de comandos y envía estos datos directamente a la salida estandar. Luego, usando el comando
/home/Decker/documentos# cat historia.txt tesis.txt
mostrará por pantalla el contenido del fichero historia.txt seguido por tesis.txt

Si no se le pasan nombres de ficheros a cat como parámetros, leerá datos de stdin y los enviará a stdout. Veamos un ejemplo.
/home/Decker/documentos# cat
Hola holita
Hola holita
mmm
mmm

[ctrl-D]
/home/Decker/documentos#
Como se puede ver, cada línea que el usuario teclea es inmediatamente reenviada al monitor por cat. Cuando se esta leyendo de la entrada estandar, los comandos reconocen el fin de la entrada de datos cuando reciben el carácter EOT (end-of-text, fin de texto). Normalmente es generado con la combinación [ctrl-D]

Veamos otro ejemplo. El comando sort toma como entrada líneas de texto (de nuevo leerá desde stdin si no se le proporcionan nombres de ficheros en la linea de comandos), y devuelve la salida ordenada a stdout. Pruebe lo siguiente:
/home/Decker/documentos# sort
bananas
pasteles
helados
[ctrl-D]
bananas
helados
pasteles
/home/Decker/documentos#
Podemos ordenar alfabéticamente la lista de la compra... no es útil UNIX? X-D

3.8.2 Redireccionando la entrada y salida

Ahora, supongamos que queremos que la salida de sort vaya a un fichero para poder salvar la lista ordenada de salida. El interprete de comandos nos permite redireccionar la salida estandar a un fichero usando el símbolo ">". Veamos como funciona.

/home/Decker/documentos# sort > listaCompra
bananas
pasteles
helados
[ctrl-D]
/home/Decker/documentos#
Como puede ver, el resultado de sort no se muestra por pantalla, en su lugar es salvado en el fichero listaCompra. Echemos un vistazo al fichero.
/home/Decker/documentos# cat listaCompra
bananas
helados
pasteles
/home/Decker/documentos#
Ya podemos ordenar la lista de la compra y además guardarla.
Supongamos ahora que teníamos guardada nuestra lista de compra desordenada original en el fichero articulos. Una forma de ordenar la información y salvarla en un fichero podría ser darle a sort el nombre del fichero a leer en lugar de la entrada estandar y redireccionar la salida estandar como hicimos arriba.
/home/Decker/documentos# sort articulos > listaCompra
/home/Decker/documentos# cat listaCompra
bananas
helados
pasteles
/home/Decker/documentos#
Hay otra forma de hacer esto. No solo puede ser re-direccionada la salida estandar, también puede ser re-direccionada la entrada estandar usando el símbolo "<".
/home/Decker/documentos# sort < articulos
bananas
helados
pasteles
/home/Decker/documentos#
Técnicamente, sort < ítems es equivalente a sort ítems, pero nos permite demostrar que sort < ítems se comporta como si los datos del fichero fueran tecleados por la entrada estandar. El interprete de comandos es quien maneja las re-direcciones. sort no recibe el nombre del fichero (articulos) a leer, desde el punto de vista de sort, está leyendo datos de la entrada estandar como si fueran tecleados desde el teclado.

Esto introduce el concepto de filtro. Un filtro es un programa que lee datos de la entrada estandar, los procesa de alguna forma, y devuelve los datos procesados por la salida estandar.

Usando la redireccion la entrada estandar y/o salida estandar pueden ser referenciadas desde ficheros. Sort es un filtro simple: ordena los datos de entrada y envía el resultado a la salida estandar. cat es incluso más simple, no hace nada con los datos de entrada, simplemente envía a la salida cualquier cosa que le llega.

3.8.3 Uso de tuberias (pipes)

Ya hemos visto como usar sort como un filtro. Pero estos ejemplos suponen que tenemos los datos en un fichero en alguna parte o vamos a introducir los datos manualmente por la entrada estandar.

¿Qué pasa si los datos que queremos ordenar provienen de la salida de otro comando, como ls?. Por ejemplo, usando la opcion -r con sort ordenaremos los datos en orden inverso. Si queremos listar los ficheros en el directorio actual en orden inverso, una forma podría ser.
/home/Decker/documentos# ls
física
historia
oscar
mates
/home/Decker/documentos# ls > fichero
/home/Decker/documentos# sort -r fichero
oscar
mates
historia
física
/home/Decker/documentos#
Aqui, salvamos la salida de ls en un fichero, y entonces ejecutamos sort -r sobre ese fichero. Pero esta forma necesita crear un fichero temporal en el que salvar los datos generados por ls. La solución es usar pipes.

El uso de pipes es otra característica del interprete de comandos, que nos permite conectar una cadena de comandos en un "pipe", donde la stdout del primero es enviada directamente a la stdin del segundo y así sucesivamente. Queremos conectar la salida de ls con la entrada de sort. Para crear un pipe se usa el símbolo "|":
/home/Decker/documentos# ls | sort -r oscar
mates
historia
física
/home/Decker/documentos#
Esta forma es más corta y obviamente más fácil de escribir.(la má corta sería usar ls con la opción -r)

Otro ejemplo útil usando el comando
/home/Decker/documentos# ls /usr/bin
mostrará una lista larga de los ficheros, la mayoría de los cuales pasará rápidamente ante nuestros ojos sin que podamos leerla. En lugar de esto, usemos more para mostrar la lista de ficheros en /usr/bin.
/home/Decker/documentos# ls /usr/bin | more
Ahora podemos ir avanzando pagina a pagina cómodamente.

Pero la diversión no termina aqui!. Podemos "entubar" más de dos comandos a la vez. El comando head es un filtro que muestra las primeras líneas del canal de entrada (aquí la entrada desde un pipe). Si queremos ver el último fichero del directorio actual en orden alfabético, usaremos:
/home/Decker/documentos# ls | sort -r | head -1
oscar
/home/Decker/documentos#
Donde head -1 simplemente muestra la primera línea de la entrada que recibe en este caso, el flujo de datos ordenados inversamente provenientes de ls).

Existen gran cantidad de filtros, cut, head, tail, sort, ...

3.8.4 Redirección no destructiva

El uso de ">" para redireccionar la salida a un fichero es destructivo: en otras palabras, el comando
/home/Decker/documentos# ls > listaCompra
sobreescribe el contenido del fichero listaCompra. Si en su lugar, usamos el símbolo ">>", la salida será añadida al final del fichero nombrado, en lugar de ser sobrescrito.
/home/Decker/documentos# ls >> listaCompra
añadirá la salida de ls al final de listaCompra.

Es conveniente tener en cuenta que la redirección y el uso de pipes son características proporcionadas por el intérprete de comandos, quien proporciona estos servicios mediante el uso de la sintaxis ">","<", ">>" y "|".