Copypasteo de
http://informatica.futuroprofesional.cl/modules/tutorials/tutoriales/a_a_linux/bash-y-el-juego-de-herramientas.html
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.
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
Para redireccionar el error estándar a un archivo se agrega tras el nombre del comando 2> nombre_archivo [35]. 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 Ubicación de archivos y directorios).
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.
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 [36]). 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.
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 <
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.
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.