3.4. Redirecciones y tuberías

3.4.1. Un poco más sobre los procesos

Para entender el principio de las redirecciones y las tuberías, necesitamos explicar una noción acerca de los procesos que todavía no ha sido introducida. Cada proceso Unix (esto también incluye a las aplicaciones gráficas) abre un mínimo de tres descriptores de archivo: la entrada estándar, la salida estándar, y el error estándar. Sus números respectivos son 0, 1 y 2. En general, estos tres descriptores están asociados con la terminal desde la cual se inició el proceso, siendo el teclado la entrada. El objetivo de las redirecciones y las tuberías es redirigir estos descriptores. Los ejemplos en esta sección lo ayudarán a comprender mejor este concepto.

3.4.2. Redirecciones

Suponga, por ejemplo, que Ud. quiere una lista de los archivos que terminan en .png[1] en el directorio imagenes. Esta lista es muy larga, por lo que Ud. desea almacenarla en un archivo para consultarla a gusto más tarde. Puede ingresar el comando siguiente:

$ ls imagenes/*.png 1>lista_de_archivos

Esto significa que la salida estándar de este comando (1) se redirecciona (>) al archivo denominado lista_de_archivos. El operador > es el operador de redirección de la salida. Si el archivo de redirección no existe, se crea, pero si existe se sobre-escribe su contenido. Sin embargo, el descriptor predeterminado que redirecciona este operador es la salida estándar y no es necesario especificarla en la línea de comandos. Entonces podría haber escrito simplemente:

$ ls imagenes/*.png >lista_de_archivos

y el resultado será exactamente el mismo. Luego, puede mirar el archivo usando un visualizador de archivos de texto tal como less.

Imagine ahora que Ud. quiere saber cuantos de estos archivos hay. En vez de contarlos a mano, puede usar el utilitario denominado wc (Word Count, Contador de palabras) con la opción -l, que escribe en la salida estándar el número de líneas en el archivo. Una solución es la siguiente:

wc -l 0<lista_de_archivos

y esto da el resultado deseado. El operador < es el operador de redirección de la entrada, y el descriptor redirigido predeterminadamente es el de la entrada estándar, es decir, 0, y Ud. simplemente tiene que escribir la línea:

wc -l <lista_de_archivos

Suponga ahora que desea quitar todas las "extensiones" de los archivos y poner el resultado en otro archivo. Una herramienta para hacer esto es sed, por Stream EDitor (Editor de flujo). Simplemente Ud. redirecciona la entrada estándar del comando sed al archivo lista_de_archivos y redirecciona su salida al archivo resultado, por ejemplo la_lista:

sed -e 's/\.png$//g' <lista_de_archivos >la_lista

y aquí tiene creada su lista, disponible para ser consultada a gusto con cualquier visualizador.

También puede ser útil redirigir el error estándar. Por ejemplo, desea saber a cuales directorios de /shared no tiene acceso: una solución es listar este directorio recursivamente y redirigir los errores a un archivo, a la vez que no se muestra la salida estándar:

ls -R /shared >/dev/null 2>errores

lo que significa que se redireccionará la salida estándar (>) a /dev/null, un archivo especial donde todo lo que escribe se pierde (es decir que, como efecto secundario, no se muestra la salida estándar) y el canal de error estándar (2) se redirecciona (>) al archivo errores.

3.4.3. Tuberías

Las tuberías (pipes, en inglés) son de alguna forma, una combinación de redirecciones de la entrada y la salida. Su principio es el de un tubo físico, de aquí el nombre: un proceso envía datos por un extremo del tubo y otro proceso lee los datos en el otro extremo. El operador de la tubería es |. Volvamos al ejemplo anterior de la lista de archivos. Suponga que Ud. quiere encontrar directamente cuantos archivos hay sin tener que almacenar la lista en un archivo temporal, entonces Ud. usaría el comando siguiente:

ls imagenes/*.png | wc -l

lo cual significa que la salida estándar del comando ls (es decir, la lista de archivos) se redirecciona a la entrada estándar del comando wc. Así, Ud. obtiene el resultado deseado.

Ud. también puede construir directamente una lista de archivos "sin las extensiones" usando el comando siguiente:

ls imagenes/*.png | sed -e 's/\.png$//g' >la_lista

o, si desea consultar la lista directamente sin almacenarla en un archivo:

ls imagenes/*.png | sed -e 's/\.png$//g' | less

Las tuberías y las redirecciones no están limitadas solamente a textos que pueden ser leídos por seres humanos. Por ejemplo, el comando siguiente enviado desde una Terminal:

xwd -root | convert - ~/mi_escritorio.png

hará una captura de pantalla de su escritorio y la almacenará en el archivo mi_escritorio.png[2] en su directorio personal.

Notas

[1]

Ud. podría creer que decir "los archivos que terminan en .png" en vez de "las imágenes PNG" es una locura. Sin embargo, una vez más, los archivos bajo Unix sólo tienen una extensión por convención: de ninguna manera las extensiones definen al tipo de archivo. Un archivo que termina en .png podría ser perfectamente una imagen JPEG, una aplicación, un archivo de texto o cualquier otro tipo de archivo. ¡Lo mismo es cierto también bajo Windows!

[2]

Sí, de hecho, será una imagen PNG :-) (Siempre y cuando tenga instalado el paquete "ImageMagick" ...)


Tux sobre Estrella por MandrakeSoft Linux es una marca registrada de Linus Torvalds. Todas las otras marcas registradas y copyrights son la propiedad de sus respectivos dueños.
A menos que se diga lo contrario, todo el contenido de estas páginas y todas las imágenes tienen Copyright de MandrakeSoft S.A. y de MandrakeSoft Inc. 2001.
http://www.mandrakelinux.com/