Linux-Mandrake: Manual de Referencia | ||
---|---|---|
Anterior | Capítulo 3. Introducción a la línea de comandos | Siguiente |
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.
Suponga, por ejemplo, que Ud. quiere una lista de los archivos que terminan en .gif[1] en el directorio images. Esta lista es muy larga, por lo que Ud. quiere almacenarla en un archivo para consultarla a gusto después. Ud. puede ingresar el comando siguiente:
$ ls images/*.gif 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. Ud. podría haber escrito simplemente:
$ ls images/*.gif >lista_de_archivos
y el resultado será exactamente el mismo. Luego, Ud. 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, Ud. 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 similarmente 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 Ud. quiere consultar esta lista, 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). Ud. simplemente 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/\.gif$//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 los errores estándars. Por ejemplo, Ud. quiere saber a cuales directorios de /shared no tiene acceso: una solución es listar este directorio recursivamente y redirigir los errores a un archivo, mientras no se muestran por el canal de 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 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 images/*.gif | 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. Ud. obtiene así, el resultado deseado.
Ud. también puede construir directamente una lista de archivos "sin las extensiones" usando el comando siguiente:
ls images/*.gif | sed -e 's/\.gif$//g' >la_lista
o, si quiere consultar la lista directamente sin almacenarla en un archivo:
ls images/*.gif | sed -e 's/\.gif$//g' | less
Las tuberías y las redirecciones no están limitadas solamente a texto que puede ser leído por seres humanos. Por ejemplo, el comando siguiente enviado desde una xterm:
xwd -root | convert - ~/mi_escritorio.gif
hará una captura de pantalla de su escritorio y la almacenará en el archivo mi_escritorio.gif[2] en su directorio personal.
[1] | Ud. podría creer que decir "los archivos que terminan en .gif" en vez de "las imágenes GIF" es una locura. Sin embargo, una vez más, los archivos bajo Unix solo tienen una extensión por convención: de ninguna manera las extensiones definen al tipo de archivo. Un archivo que termina en .gif podría ser perfectamente una imagen JPEG, una aplicación, un archivo de texto o cualquier otro tipo de archivo. |
[2] | Sí, de hecho, será una imagen GIF :-) |
Anterior | Inicio | Siguiente |
Patrones de englobamiento del shell y expresiones regulares | Subir | El completado de la línea de comandos |