==== Redirección y tuberías ====
En Unix, todo programa tiene 3 canales estándar para intercambiar información con el usuario, con el hardware o con otros programas: salida estándar, entrada estándar y error estándar, que verá abreviados como ##stdout##, ##stdin## y ##stderr## respectivamente. Estos canales pueden conectarse a archivos, a dispositivos o a canales de otros programas (tuberías). Por defecto la entrada estándar es el teclado, mientras que la salida y el error estándar son la pantalla.
Canal disponible en cada programa para enviar la información que produce. Cuando se inicia un programa desde la línea de comandos sin redireccionamiento se trata de la pantalla.
Canal disponible en cada programa para recibir información que produce. Cuando se inicia un programa desde la línea de comandos sin redireccionamiento se trata del teclado.
Canal disponible en cada programa para enviar información sobre errores que ocurran. Cuando se inicia un programa desde la línea de comandos sin redireccionamiento se trata de la pantalla.
Por ejemplo los programas cat y sort si no reciben un archivo como parámetro esperan información de la entrada estándar y envián el resultado de su operación a la salida estándar; para comprobarlo ejecute el programa cat o el programa sort sin argumentos.
Para redireccionar la salida estándar a un archivo se agrega al final del comando una cadena de la forma "##> ##//nombre_archivo//####". Por ejemplo para ordenar un archivo ##palabras.txt## y dejar el resultado en ##ord.txt##:
sort palabras.txt > ord.txt
Caracter empleado para redireccionar la salida estándar a un archivo o dispositivo (se pone entre el nombre del comando y el nombre del archivo o dispositivo).
Para redireccionar el error estándar a un archivo se agrega tras el nombre del comando ##2> ##//nombre_archivo//#### [6]. Por ejemplo:
cat /ceq11 2> err.txt
escribirá en el archivo ##err.txt## un mensaje como "##cat: /ceq11: No existe el fichero o el directorio##"
claro está mientras efectivamente no exista el archivo ##/ceq11##. Pueden redireccionarse tanto salida estándar como error estándar simultáneamente, por ejemplo:
cat /etc/fstab > /dev/null 2> /dev/null
redireccionará tanto salida como error estándar al dispositivo ##/dev/null##
El dispositivo ##/dev/null## es como un agujero negro, todo lo que envié ahí desaparece (ver http://es.tldp.org/Manuales-LuCAS/AA_Linux_colegio-1.1/AA_Linux_colegio-1.1-html/x6432.htm#ubicacion-de-archivos-y-directorios Ubicación de archivos y directorios).
Caracteres empleados para redireccionar el error estándar, se ponen entre el nombre del comando y el nombre archivo o dispositivo al que se redirecciona.
Por defecto al redireccionar con ##>## a un archivo, se crea un nuevo archivo, en caso de que ya existiera su contenido previo se pierde y es remplazado por la información redireccionada. Por ejemplo después de ejecutar la secuencia:
sort 1.txt > ord.txt
sort 2.txt > ord.txt
quedará en ##ord.txt## únicamente el contenido de ##2.txt## ordenado. Para agregar la información redireccionada al final de un archivo ya existente puede emplear ##>>## en lugar de ##>##, retomando el ejemplo anterior:
sort 1.txt > ord.txt
sort 2.txt >> ord.txt
dejará en ##ord.txt## el contenido de ##1.txt## ordenado y a continuación el de ##2.txt## ordenado.
Caracteres empleados para redireccionar la salida estándar y agregarla al final de un archivo.
Para lograr que la entrada estándar sea leída de un archivo, se agrega al final del comando ##< ##//nombre_archivo//####. Por ejemplo
head < arc.txt
presentará las 10 primeras líneas del archivo ##arc.txt## (es equivalente a head arc.txt o a head - < arc.txt [7]). Poder redireccionar la entrada estándar de un programa puede ahorrarle tiempo, porque puede escribir la secuencia de líneas que desea enviar al programa en un archivo y después repetirla tantas veces como desee. Por ejemplo para enviar el mismo correo electrónico a varias personas puede escribirlo en un archivo ##correo.txt## y después ejecutar algo como:
mail usuario1@micolegio.edu.co usuario2@micolegio.edu.co < correo.txt.
Caracter empleados para redireccionar la entrada estándar para que provenga de un archivo o dispositivo.
Empleando redireccionamiento y los comandos y programas que ya se han presentado se pueden hacer rápidamente muchas labores. Un ejemplo es dividir un archivo grande para transportarlo en varios disquetes: con ##split -b 1000000 grande.gz## divide el archivo ##grande.gz## en varias partes, cada una de las cuales cabe en un disquete (digamos que queda dividido en tres partes ##xaa##, ##xab## y ##xac##). Puede copiar cada una de las partes en un disquete, llevar los disquetes a otro computador y emplear cat y redireccionamiento para unirlos:
cat xaa xab xac > grande.gz
Otra facilidad para redireccionar entrada estándar es ##<<##, que después de un comando permite escribir un texto que se constituirá en la entrada estándar. A continuación de ##<<## debe ponerse una palabra, escogida por usted, que indicará fin de entrada. La entrada estándar constará de las líneas que se digiten a continuación hasta la primera que contenga sólo la palabra que indicaba fin de entrada. Por ejemplo:
sort <<FIN
pábulo
opíparo
FIN
ordenará las palabras dadas (excepto ##FIN## que indica el fin de la entrada). Así, ##<<## es equivalente a editar un archivo y después redireccionarlo a la entrada estándar de un programa.
Caracteres empleados para indicar que la entrada estándar a un comando se digitara a continuación, terminando con una cadena. Se pone entre el comando y la palabra que indica fin de entrada.
El operador de composición '|' permite redireccionar la salida de un comando en la entrada estándar de otro (es como pegar dos tubos). Por ejemplo:
ls -l / | wc -l
mostrará la cantidad de archivos y directorios en el directorio ##/##. Al ejecutar ls -l / se envía a salida estándar la lista de archivos del directorio raíz, cada uno en una línea, con '##|##' esta salida se convierte en entrada de wc -l; el programa wc con la opción ##-l## presenta sólo la cantidad de líneas de la entrada estándar.
El ejemplo anterior pudo haberse realizado en dos pasos empleando un archivo temporal, digamos ##temp.txt##:
ls -l / > temp.txt
wc -l < temp.txt
pero claro está, ##|## es más práctico y aún más cuando deben componerse más de dos programas.
Caracter empleado para conectar salida estándar de un comando con entrad estándar de otro, se pone entre los dos comandos.
No hay comentarios:
Publicar un comentario