Francisco Javier López Torrijos
Analista Sistemas Informáticos de Gestión
Diseño y Desarrollo Web
En esta sección vamos a ver que es esto de los Flujos, Redirecciones, y Pipes (tuberías o canalizaciones), vamos a ver que son los flujos para poder entender y aprovecharnos de los redireccionamientos y Pipes
Principales tipos de flujos de entrada y de salida:
Al redireccionar un flujo lo que hacemos es modificar el comportamiento natural del sistema o programa, p.ej. enviar la salida de un programa a un fichero, tomar la entrada para un programa de un fichero, un poco mas abajo veremos unos ejemplos.
Veamos una tabla con los operadores más comunes de redirección
Operador Redirección | Efecto del Operador |
---|---|
> |
Redirige la stdout a un fichero, si no existe lo crea, y si existe lo sobre escribe (borra el contenido antes de incluir el nuevo contenido) |
>> |
Añade la stdout a un fichero, pero a diferencia del anterior la añade al fichero especificado |
2> |
Redirige la stderr a un fichero, si no existe lo crea, y si existe lo sobre escribe (borra el contenido antes de incluir el nuevo contenido) |
2>> |
Redirige la stderr a un fichero, pero a diferencia del anterior la añade al fichero especificado |
&> |
Crea un fichero tanto con stdout como con stderr , si ya existe elimina primero su contenido |
< |
Envía el contenido del fichero especificado como stdin |
<< |
Utiliza como stdin las líneas de texto pasadas |
<> |
El fichero especificado será utilizado tanto como stdin como stdout |
Estos direccionamientos se pueden utilizar de diversas formas con algunos conocimientos y algo de imaginación pueden a llegar a ser una herramienta muy potente.
El comando tee nos permite enviar la stdin tanto a stdout como a aquellos ficheros que deseemos, con ello podríamos mostrar el resultado de un programa tanto por la pantalla como almacenarlo en un fichero.
p.ej.:
programa | tee ficheroSalida.txt
Vemos que con "|" canalizamos la salida de programa a "tee" y con este ultimo hacemos que dicha salida aparezca tanto por stdout como al fichero ficheroSalida.txt
Recordad que con man o info desde la consola podemos ver todas las opciones de los distintos comandos que podamos necesitar
Las Pipes (canalización) se usan para redireccionar la stdout de un programa hacia la la stdin de otro, o lo que es lo mismo utilizar la salida de un programa como entrada de otro, en principio no hay límite en el número de programas utilizados, veamos un ejemplo para genérico para comprender su funcionamiento
programa1 | programa2 | script3 | ..... | programaN
Ahora un ejemplo mas práctico, el cual utilizaremos para ver la línea de la salida de ifconfig (herramienta que nos devuelve la información de una tarjeta de red) en la que aparece la MAC de la misma, mediante grep
ifconfig eth0 | grep direcciónHW
la cual, suponiendo la existencia en nuestro sistema de una tarjeta de red eth0, nos devuelve algo parecido a:
eth0 Link encap:Ethernet direcciónHW 00:15:f2:1b:65:ec
Las Pipes pueden llegar a ser una herramienta muy potente, mucho mas de lo que parece con la primera impresión, tanto para seguimiento de errores, como en configuración del sistema, seguridad,... y todo aquello que la imaginación nos permita
Vamos a ver un ejemplo en el que utilizaremos la salida de un comando mediante una Pipes (|), para utilizarla con otro comando para realizar una tarea repetitiva, y así agilizar nuestro trabajo.
Voy a utilizar algunos comandos que no hemos visto, que veremos mas adelante en una sección dedicada a los comandos mas comunes, por lo que simplemente diré lo que hacen a forma de indicación. Si alguien tiene interés en ir investigando para conocer más a fondo los distintos comandos, os recuerdo que podéis utilizar man (man comando) o info (info comando) para ver todas las opciones y algunos ejemplos de los comandos que vayamos viendo.
Abriremos un terminal si estamos utilizando una distribución con entorno gráfico, que en estos tiempos será lo mas habitual.
Con el pipe le pasamos a rm mediante xargs cada resultado devuelto por ls *1, por lo que se construyen 4 comandos rm y el nombre de cada fichero que cumple el patrón *1
En este caso en concreto podríamos haber realizado lo mismo con:
rm *1
Pero como indiqué antes hemos utilizado un pipe para ilustrar un ejemplo sencillo