Como en UNIX también en GNU/Linux

En el capítulo anterior vimos el funcionamiento de la interfase de comandos bash y comenzamos viendo el poder que posee Un*x para el manejo de la información. En este capítulo trataremos temas un poco más específicos, concentrándonos en los aspectos más importantes que podremos ver en nuestro sistema operativo. El hecho de que estas terminologías empleadas en GNU/Linux, antes se hayan aplicado a Un*x, hacen que él saberlas nos abra las puertas a todo un sinfín de particularidades compartidas que hacen mucho más versátil el trabajo con cualquier entorno que sea equivalente.

Plomería en GNU/Linux

Entrada y salida estándar

Hablamos antes de los 3 archivos que el sistema abría en memoria al iniciarse, estos eran el stdin, el stdout y stderr. El intérprete de comandos configurará estos archivos para que apunten al teclado, en el caso del stdin, y al monitor, en el caso del stdout y stderr. Existen numerosos comandos de Un*x que utilizan la entrada estándar para tomar sus datos y la salida estándar para volcarlos a la pantalla. La configuración esta dada de este modo ya que el shell espera que se ingresen los datos por el teclado y que su resultado o algún error se reflejen en la pantalla. Un ejemplo seráa el caso del comando cat. Si usáramos el comando cat, sin ningún argumento, todo lo que ingresemos se vería repetido en la pantalla.

[shrek@pantano:~]$ cat
Hola      (1)
Hola      (2)
Que tal   (3)
Que tal   (4)
(1)(3)
Línea escrita por nosotros.
(2)(4)
Línea devuelta a la salida estándar.

La entrada se termina presionando Ctrl-D que es el carácter de EOT (end of text) fin de texto.

Canalización y redirección

Existe la posibilidad de desviar la salida o la entrada a un comando para poder realizar funciones complejas u obtener los datos que saldrían por la pantalla directamente a otro archivo. Lo primero se denomina canalización y lo segundo redirección. El símbolo que se utiliza para efectuar la canalización es el denominado pipe o símbolode canalización (|). Este símbolo permite que se pase la salida de unacomando o programa a la entrada de otro. Un ejemplo clásico de lautilización de este símbolo es cuando se requiere listar un directorioque ocupa más de una pantalla. Se podrá entonces utilizar el comandoclásico para listar ls y enviar su salida a otroprograma que lo muestre de a una página de pantalla por vez, por ejemplo el more.

[shrek@pantano:~]$ ls -l | more

Esto servirá para realizar lo antedicho ya que la salida del comando ls será canalizada para que sea la entrada del comando more y este se encargara de mostrar los datos por pantalla. Lo que se esta utilizando es la canalización de la entrada estándar y la salida estándar. La salida estándar del comando ls es redireccionada hacia la entrada estándar del comando more que es cambiada para que también apunte a la canalización. Otros dos símbolos utilizados son el < y el >. Lo que hacen es redirigir tanto la salida como la entrada estándar de o hacia un archivo. Por ejemplo, supongamos que necesitamos guardar en un archivo llamado listado la salida del comando ls.

[shrek@pantano:~]$ ls > listado

Con esto le indicamos al comando ls que redireccione la salida estándar hacia un archivo de nombre listado. En caso de que el archivo exista, será reemplazado con la nueva información. Para agregar contenido a un archivo, inmediatamente después del contenido que posea, se tendrá que poner el símbolo de redirección dos veces

[shrek@pantano:~]$ ls >> listado

El uso de < es para redireccionar el contenido de un archivo hacia la entrada estándar de un comando o programa. Supongamos que necesitamos ordenar el contenido de un archivo en orden alfabético, lo que lograremos con el comando sort. Podremos entonces redireccionar el contenido de un archivo a la entrada del comando sort para que éste lo ordene.

[shrek@pantano:~]$ sort < nombres

De esta manera saldría por pantalla la lista de nombres ordenadas alfabéticamente. También se podrá redireccionar el error estándar para que no salga en pantalla. Si quisieramos realizar un listado de un directorio y, en caso de producirse un error, este fuese redirigido a un archivo, haremos lo siguiente

[shrek@pantano:~]$ ls /bin 2>/tmp/error.ls

Esta simple redirección solo tendría efecto sobre el error estándar (stderr) o como también se denomina, descriptor de archivo nº 2. Con esta redirección los posibles errores serían redirigidos al archivo /tmp/error.ls. Si quisiéramos dividir tanto la salida por pantalla como el error en dos archivos separados podemos hacerlo de esta manera

[shrek@pantano:~]$ ls /bin 1>/tmp/salida 2>/tmp/error.ls

La redirección y la canalización pueden combinarse para hacer cosas un poco más complejas o realizar tareas en un solo paso. Supongamos que necesitábamos obtener las 10 primeras líneas del listado que anteriormente guardamos del directorio /bin. Para esto podríamos usar el comando head directamente para que obtenga las 10 primeras líneas del archivo listado, pero para entender el uso combinado de la canalización y la redirección lo haremos de otra forma

[shrek@pantano:~]$ sort < listado | head

Como se puede ver, se a pasado por medio de una redirección el contenido del archivo listado al comando sort y por medio de la canalización hemos pasado la salida estándar del comando sort al comando head.