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.
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.
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 |
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.
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 !
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.
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]