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, pero excluye a la mayoría de los demonios) 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.
Suponga, por ejemplo, que Usted quiere una lista de los archivos que terminan en .png[7]en el directorio imagenes. Esta lista es muy larga, por lo que Usted 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 Usted 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 Usted 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 Usted 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.
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 Usted quiere encontrar directamente cuantos archivos hay sin tener que almacenar la lista en un archivo temporal, entonces Usted 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í, Usted obtiene el resultado deseado.
Usted 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 |
enviará una captura de pantalla de su escritorio al archivo mi_escritorio.png[8] en su directorio personal.
[7] Usted 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 un 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!
[8] Sí, de hecho, será una imagen PNG :-) (Siempre y cuando tenga instalado el paquete “ImageMagick” ...)