REDIRECCIONAMIENTO DE ENTRADA/SALIDA




Cualquier comando de UNIX necesita recibir información de algún "lugar" y enviar los resultados del procesamiento a algún "lugar", así como los mensajes de error. Estos "lugares" se llaman, respectivamente, STANDAR INPUT, STANDAR OUTPUT y STANDAR ERROR.

El standar input se refiere al medio desde el cual el comando recibe la información. De forma similar, el standar output se refiere al lugar que el comando envia la salida. Cuando se redireccionan los datos el comando recibe o envía la información desde otra fuente.

El standar error se refiere al medio al que se mandan los mensajes de los errores que se cometen al ejecutar un comando.

Normalmente (aunque depende de cada comando), el standar input es el teclado, y el standar output y el standar error es la pantalla.



1. REDIRECCIONAMIENTO DE LA SALIDA



El símbolo para redireccionar la salida es: > y se utiliza de la siguiente forma:



comando > nombre_fichero


La tabla 7.1. contiene algunos ejemplo de redireccionamiento de la salida utilizando algunos comandos básicos de UNIX.



who > usuarios Almacena el listado de que origina el comando who en un fichero llamado usuarios.
sort file_1 > file_2 Almacena el contenido ordenado del fichero file_1 en el fichero file_2.
diff file_1 file_2 > difer Almacena las diferencias entre los ficheros file_1 y file_2 en el fichero difer
head -2* > heads Almacena las 2 primeras líneas de cualquier fichero en un fichero llamado heads.

Tabla 7.1. Ejemplos de redireccionamiento de salidas.



1.1. ALGUNAS PRECAUCIONES QUE SE DEBEN TENER AL REDIRECCIONAR LA SALIDA



Veamos 2 problemas que pueden ocurrir si accidentalmente cometemos un error:



A.- REDIRECCIONAR LA SALIDA A UN FICHERO YA EXISTENTE



Cuando se redirecciona una salida, el sistema UNIX crea un fichero con el nombre especificado. Cuando el fichero no existe, al redireccionar la salida a él crea uno nuevo; pero si el fichero existe borra su contenido y reescribe encima. Afortunadamente, existe una manera de prevenir borrar ficheros de esta forma sin darnos cuenta, utilizando el comando:



set noclobber

Si tecleamos este comando antes de redireccionar la salida, en el caso de que el fichero donde se envía la salida ya exista, aparecerá en la pantalla el siguiente mensaje:


nombre del fichero file exists

y no "machacaría" el contenido del fichero.

El comando set noclobber evita que se :

El comando sólo es efectivo para la sesión en que se teclee. Si se quiere que permanezca de forma permanente, hay que inluir el comando set noclobber en el fichero .cshrc. del Home directory.

Si en algún momento se quisiera quitar esta protección, hay que teclear >!.

Veamos un ejemplo:



%set noclobber
%cat agenda
contestar carta al señor Alvarez
%date > agenda
agenda : file exists
%cat agenda
contestar carta al señor Alvarez
%date >! agenda
%cat agenda
Mon May 4 08:50:38 CDT 1989

Figura 7.1.



B.- REDIRECCIONAR LA SALIDA A UN FICHERO UTILIZADO COMO ENTRADA.



Veamos con un ejemplo lo que ocurre cuando se redirecciona la salida al fichero utilizado como entrada.



%cat frutas
plátano
naranja
manzana
%sort frutas>frutas
%cat frutas
%

Figura 7.2.



Observemos que cuando se ejecuta el comando sort el UNIX borra el contenido del fichero frutas y crea un fichero nuevo de nombre frutas, por lo que cuando va a ordenar alfabéticamente el fichero frutas, y éste está vacío. Por lo tanto, hay que tener cuidado de no redireccionar la salida al fichero utilizado como entrada, pués se perdería la información.



2. AÑADIR LA SALIDA DE UN COMANDO A UN FICHERO



Se puede añadir la salida de un comando al final de un fichero ya existente sin borrar su contenido. El símbolo que se utiliza para ello es >> ; se hará de la siguiente forma:



comando>>nombre_fichero


3. REDIRECCIONAMIENTO DEL STANDAR ERROR



Para redireccionar el standar output y el standar error a un fichero, se utilizan los símbolos >& de la forma siguiente:



comando >& nombre_fichero


Por ejemplo:

cat datos_1 datos_2 >& datos


entonces, el contenido de ambos ficheros, datos_1 y datos_2 se escribe en el fichero datos junto con cualquier mensaje de error que se produzca.



Para añadir la salida de un comando, así como los mensajes de error a un fichero, se utilizan los símbolos >>& de la siguiente manera:



comando >>& nombre_fichero


Por ejemplo:

cat datos>_1 datos_2 >>& datos


entonces, el contenido de los ficheros datos_1 y datos_2 y cualquier mensaje de error que se produzca, se añade al final del contenido del fichero datos.



4. REDIRECCIONAMIENTO DE LA ENTRADA



El símbolo para redireccionar la entrada es < y se utiliza de la siguiente manera:



comando < nombre_fichero


Por ejemplo:

sort < Agenda > Agenda.ord

ordena alfabéticamente el contenido del fichero Agenda y lo almacena en el fichero Agenda.ord



Si se quiere utilizar como entrada parte del contenido de un fichero, habría que poner en el fichero un "string", que puede ser cualquier símbolo excepto, zzFunyzz. Es decir :



comando << string
.......
.......
.......
string


Por ejemplo:

%cat < Madrid.dat << !
777
666
!
%

es decir, se editará por pantalla el contenido del fichero Madrid.dat hasta el símbolo !



5. PIPES: TRANSFERENCIA DE DATOS



El sistema UNIX permite transferir datos entre diferentes procesos (comandos). Este proceso se llama " piping", pués "pipe" es el nombre que se le dá al símbolo utilizado para transferir datos.



El símbolo para "piping" es | y se utiliza de la siguiente manera:



comando_1 | comando_2 | comando_3 | ......


Es decir, el comando_2 utiliza como entrada los resultados obtenidos por el comando_1; la salida del comando_2 se utiliza como entrada del comando_3, y así sucesivamente.



Utilizando pipes no es necesario utilizar ficheros temporales ni hacer pasos intermedios para obtener la información que se desea. Por ejemplo, si ponemos:

who | sort | lpr

entonces la lista de usuarios conectados al sistema se ordenan alfabéticamente y se imprime (odenada) por la impresora del sistema.



6. FILTROS



Un filtro es cualquier comando situado entre dos pipes y manipula los datos obtenidos por un comando previo antes de utilizarse por el comando situado a continuación del filtro. Una línea de comando puede contener varios filtros.



En el ejemplo:

who | sort | lpr

el comando sort actúa como filtro.



6.1. COMANDO tee



Cuando después de un pipe aparece el comando tee la redirección de la salida la hace a dos sitios, a un fichero especificado y al standar output:



comando | comando | tee nombre_fichero | comando | ......


En el ejemplo:

who | sort | tee listin | more

la lista de usuarios ordenada alfabéticamente, aparece por pantalla y se almacena en el fichero listin





[Indice]