Redireccionamiento y encadenamiento de Comandos en UNIX





Redireccionamiento y encadenamiento de Comandos en UNIX

Cuando un comando comienza su ejecución, este normalmente espera que tres archivos estén ya abiertos: un standard input SI, un standard output  SO y un diagnostic output (también llamado standard error SE). Un número llamado file descriptor está asociado con cada uno de estos archivos. Por convención el file descriptor 0 esta asociado con la SI, el file descriptor 1 esta asociado con la SO y el file descriptor 2 esta asociado con la SE.
Todos estos archivos están inicialmente conectados a la terminal (0 al teclado, 1 y 2 a la pantalla de la terminal).
Como decíamos la standard input y la standard output están nuevamente asociadas a la terminal; sin embargo puesto que la standard input y la standard output están establecidos por el shell, es posible que sean reasignadas por este.
La habilidad del shell de reasignar la SI y la SE es una de las características más importantes de sistema UNIX.
Supongamos que deseamos tener la salida del comando ps:
$ ps
el programa process status escribirá esta información sobre la SO, es decir sobre nuestra pantalla. Sin embargo si entramos el comando:
$ ps >posteridad
el resultado será ligeramente diferente porque la SO está redireccionada. El programa process status intentó escribir la información sobre la pantalla, pero debido a la notación especial ">posteridad", el shell conectó la SO a un archivo común llamado "posteridad". No veremos la salida del comando sobre la pantalla. El símbolo mayor ">" es un caracter especial del shell, que especifica que la SO de un comando debe ser dirigida a un archivo indicada por la próxima palabra en el comando.
Si el archivo ya existe, se destruye el contenido previo. Podemos verificar el resultado simplemente tipeando:
$ cat posteridad
La utilidad más visible del comando cat, es precisamente concatenar:
$ cat archi1 archi2>archi3
Ocasionalmente si deseamos dirigir la salida a un archivo, pero queremos que la misma sea adicionada al final del archivo, lo hacemos con el doble redireccionamiento ">>".
$ cat archi1 >> archi2
si el archivo archi2 existe, el mismo ahora tendrá el contenido de archi1 más el contenido de archi2; si el archivo archi2 no llegara a existir, luego de este comando quedan los dos archivos archi1 y archi2 con el mismo contenido.
Si quisieramos que algún mensaje de error, o algún tipo de diagnóstico dado por algún comando no salga sobre la SO, sino que sea redireccionado a un archivo, como es el caso de alguna compilación, debemos hacerlo de la siguiente forma:
$ cc archi1 2>archi2
estamos asignando el file descriptor número 2 a un archivo.
La SI también puede ser redireccionada. Para ello utilizamos el signo menor "<". Puesto que la SI puede ser redireccionada, es posible que el shell adquiera los comandos desde un archivo ordinario. Por ejemplo: si generamos con un editor el archivo "comandos" y dentro de él colocamos:
$ cat >comandos
ps
date
l
Luego para invocarlo desde el shell, también lo podemos hacer de la forma:
$ sh <comandos
el cual ejecutará los comandos que están dentro de este archivo. Un ejemplo más claro lo tenemos con el comando write:
$ write tty01 <mensaje
con lo cual no necesitamos incorporar el mensaje a enviar desde el teclado, sino que directamente tomará como SI el contenido que está en el archivo "mensaje".
Es posible la combinación de ambas dentro de una línea de comandos. Ejemplo:
$ sh <comandos > resultado
con lo cual tendremos de los tres programas (ps, date, l); el mismo será grabado sobre el archivo resultado. Si queremos crear un archivo nuevo llamado newfile tendremos que digitar lo siguiente:
$ > newfile
Una estructura tipo pipe conecta la SO de un programa a la SI de otro programa. Un pipe es diferente de una redirección de Entrada/Salida. La redirección de una salida graba la salida de un programam en un archivo, y la dirección de entrada causa que un archivo contenga la información de entrada a un programa; mientras que un pipe directamente conecta la salida de un programa con la entrada de otro programa.
Supongamos que quisieramos saber cuantos archivo están en mi directorio (/usr/com1). Quizás el método más obvio es contar el número de líneas que aparecen cuando yo ejecuto el comando l ; pero también existe el comando wc, para lo cual una primer técnica podría ser la siguiente:
$ l /usr/com1 >temparchi
$ wc -l temparchi
$ rm temparchi





Utilizando el método de pipe el cual se conecta a traves de la barra vertical "|", la línea de comando resulta más práctica:
$ l /usr/com1 | wc -l
Ejemplos:
$ who | lpr
imprime los usuarios que están actualmente logeados.
$ who | grep juan | pr
muestra por pantalla y paginado, una lista de los usuarios cuyo nombre de login es "juan".





También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *