Intentemos abordar un problema simple: conseguir un listado del directorio /usr/bin. Si hacemos "ls /usr/bin" , algunos de los nombres de los ficheros saldrán por arriba de la pantalla. ¿Como se pueden ver todos los ficheros?
Algunos conceptos de Unix
El sistema operativo Unix facilita mucho a los programas el uso del terminal. Cuando un programa escribe algo en la pantalla, está usando algo llamado salida estándar. Salida estándar, en inglés standard output o stdout, es la manera que tiene el programa de escribirle cosas al usuario. El nombre por el que se indica un programa es entrada estándar (stdin). Es posible que un programa se comunique con el usuario sin usar la entrada o salida estándar, pero la mayoría de los comandos que se tratan en este libro usan stdin y stdout.
Por ejemplo, el comando ls imprime una lista de los directorios en la salida estándar, que está normalmente "conectada" al terminal. Un comando interactivo, como el shell, bash, lee los comandos de la entrada estándar.
Un programa también puede escribir en el error estándar, ya que es muy fácil hacer que la salida estándar apunte a cualquier lugar aparte del terminal. El error estándar (stderr) está casi siempre conectado al terminal para que alguna persona pueda leer el mensaje.
En esta sección, examinaremos tres modos de enredarse con la entrada y salida estándar: redireccionar la salida, redireccionar la entrada, y las tuberías.
Redireccionar la salida
Un aspecto muy importante de Unix es la posibilidad de redireccionar la salida. Esto permite que, en vez de ver los resultados de un comando, los salvemos en un fichero o los enviemos directamente a una impresora. Por ejemplo, para redireccionar la salida del comando "ls /usr/bin", se coloca un signo ">" al final de la línea, y se indica el fichero donde dejar la salida:
/home/larry$ ls
/home/larry$ ls -F /usr/bin > listado
/home/larry$ ls
listado
/home/larry$
Como se puede ver, en vez de escribir los nombres de todos los ficheros, el comando crea un fichero totalmente nuevo en el directorio actual. Echemos un vistazo a este fichero usando el comando cat.
Si se recuerda, cat era un comando bastante inútil que copiaba lo que se escribía (entrada estándar) al terminal (salida estándar). cat también imprime un fichero en la salida estándar si se indica el fichero como parámetro:
/home/larry$ cat listado
..
/home/larry$
La salida exacta del comando "ls /usr/bin" aparece en el contenido de listado. Por ahora todo bien, sin embargo no resuelve el problema original.3
A pesar de todo, cat hace algunas cosas interesantes cuando se redirecciona su salida. ¿Qué hace el comando "cat listado > fichero"? Normalmente, el "> fichero" dice "coge toda la salida del comando y ponla en fichero". La salida del comando "cat listado" es el fichero listado. Así hemos inventado un nuevo (y no tan eficiente) método de copiar ficheros.
¿Qué ocurre con el comando "cat > zorro" ? cat lee cada línea escrita en el terminal (entrada estándar) y la imprime de vuelta (salida estándar) hasta que lee |_Ctrl-d_|. En este caso, la salida estándar se ha redireccionado al fichero zorro. Ahora cat sirve como un editor rudimentario:
/home/larry$ cat > zorro
El rapido zorro marron salta sobre el descuidado perro.
pulsa Ctrl-d
Ahora se ha creado el fichero zorro que contiene la frase "El rapido zorro marron salta sobre el descuidado perro". Un último uso del versátil comando cat es concatenar ficheros. cat imprimirá cada fichero dado como parámetro, uno despues de otro. El comando "cat listado zorro" imprimirá el listado del directorio /usr/bin, y luego la tonta frase. Así, el comando "cat listado zorro > listyzorro" creará un nuevo fichero conteniendo los contenidos de listado y zorro.
Redireccionar la entrada
Así como cuando se redirecciona la salida estándar, es posible redireccionar la entrada. En lugar de que un programa lea su entrada desde el teclado, la leerá desde un fichero. Como redireccionar la entrada está relacionado con redireccionar la salida, parece natural que "<" sea el carácter para redireccionar la entrada. Éste también se usa después del comando que se desee ejecutar.
Esto es generalmente útil si se tiene un fichero de datos y un comando que espera sus datos desde la entrada estándar. Muchos comandos permiten especificar un fichero sobre el cual operar, así que en las actividades diarias el "<" no se usa tanto como otras técnicas.
Las tuberías
Muchos comandos Unix producen gran cantidad de información. Por ejemplo, es normal que un comando como "ls /usr/bin" produzca más salida que la que se puede ver en pantalla. Para que se pueda ver toda la información de un comando como "ls /usr/bin" , es necesario usar otro comando Unix llamado more4. more parará cada vez que la pantalla se llene de información. Por ejemplo, "more < /etc/rc" mostrará el fichero /etc/rc como lo haría "cat /etc/rc" , excepto que more permite leerlo. more también admite el comando "more /etc/rc" , y esa es la forma normal de invocarlo.
_
3 Para lectores impacientes, el comando que se debe usar es more. Sin embargo, hay que hablar un poco sobre algo más antes de llegar ahí.
4 Se llama more porque ese es el indicador que originalmente mostraba: "--more--". En varias versiones de Linux el comando more es identico a un comando más avanzado que hace todo lo que more puede hacer y más aún. Como demostración de que los programadores de ordenadores son malos cómicos, llamaron a este nuevo programa "less".
Sin embargo, eso no ayuda al problema de que "ls /usr/bin" muestre más información de la que se pueda ver. "more < ls /usr/bin" no funciona, ¡la redirección de entrada sólo funciona con ficheros, no comandos! Se podría hacer esto:
/home/larry$ ls /usr/bin > temp-ls
/home/larry$ more temp-ls
..
/home/larry$ rm temp-ls
Pero, Unix propone una forma más limpia de hacerlo. Se puede usar el comando "ls /usr/bin _ more". El carácter "_" es una tubería. Como una tubería de agua, una tubería Unix controla el flujo. En vez de agua, se controla el flujo de información.
Los filtros son programas muy útiles para usarse en conjunción con las tuberías. Un filtro es un programa que lee la entrada estándar, la cambia de alguna manera, y la saca por la salida estándar.
more es un filtro, lee los datos que coge de la entrada estándar y los muestra por la salida estándar pantalla a pantalla, permitiendo leer el fichero. more no es un gran filtro porque su salida no se puede enviar a otro programa.
Otros filtros incluyen los programas cat, sort, head, y tail. Por ejemplo, si se quiere leer sólo las primeras diez líneas de la salida de ls, se puede usar "ls /usr/bin _ head" .