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
[17]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, por ejemplo 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
[18] en su
directorio personal.
[17] 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®!
[18] Sí, de hecho, será una imagen PNG (Sin embargo, debe estar instalado el paquete ImageMagick).