LPIC-1 Tema 103.4: flujos, tuberías y redirecciones
Decía Dennis Ritchie que «UNIX es muy simple, sólo se necesita un genio para entender su simplicidad.«. Y creo que éste es uno de los temas clave para entender un poco cómo trabajan los sistemas tipo *nix. Se trata del tema 103.4 de las certificaciones LPIC-1, destinado a los flujos de datos, las tuberías (pipes) y redirecciones. Si comprendes esto, tendrás una buena idea de cómo aprovechar la gran flexibilidad que aporta este sistema…
Las preguntas de los exámenes del LPI relacionadas con este punto piden que demuestres tus habilidades para saber manejar las redirecciones, los flujos, pipes, pero también que comprendas cuál es la entrada estándar, la salida estándar, y la de error, así como manejar un par de herramientas fundamentales: tee y xargs.
Corrientes
Esto es sencillo de aprender, y si has leído anteriores entradas ya sabrás un poco de qué va. En Unix, y por tanto en Linux, existe las siguientes corrientes o flujos:
- Entrada estándar (stdin): su descriptor es 0, y por defecto es el teclado, desde donde se toman los datos, aunque se puede variar.
- Salida estándar (stdout): su descriptor es 1, y por defecto es una ventana o la pantalla por donde los programas suelen mostrar la información.
- Salida de error estándar (stderr): un segundo flujo de salida es el del error, cuyo descriptor es 2. Se envía al mismo medio que stdout para mostrar errores.
- Otros: lo que poca gente sabe es que, aunque existen 3 estándar, se pueden abrir otros 7 canales más.
Debes saber que los programas tratan a esas entradas y salidas como si fuesen archivos (los pueden abrir, leer, escribir, y cerrar). Esto es importante para entender lo próximo…
Redirecciones
Existen herramientas que pueden alterar esos flujos, como los caracteres especiales que se pueden emplear para las redirecciones. Por ejemplo:
#Redirige la salida estándar de un programa a un archivo uname -a > info.txt #Usar un archivo para alimentar la stdin de un comando, es decir, la dirección inversa al anterior cat < info.txt #Igual a > pero añade el contenido al final del fichero sin borrar el contenido previo uname -a >>info.txt #Existe también la dirección contraria << para aceptar texto desde la entrada estándar. Por ejemplo, ésto aceptará introducir líneas de texto desde el teclado hasta que introduzcas EOF << EOF #Ejecuta un comando y si éste genera un error, el mensaje de error se almacenará a un fichero o puedes "silenciarla" enviándola a /dev/null. touch hola{A..Z} 2> errores.txt touch hola{A..Z} 2> /dev/null *NOTA: puedes usar también 2>> para adjuntar el error a un fichero, 2>&1 para enviar el error a la stdin, >& para redirigir error a un fichero o dispositivo, &> crear un fichero que contendrá la salida estándar y la de error, <> para especificar que el fichero se use para la stdin y stdout también, etc.
Piping, tee y xargs
Otra de las formas que tiene Unix para manipular las entradas y salidas y generar canalizaciones o tuberías de un programa a otro son las pipes o tuberías. De esta forma, la stdout de un programa puede usarse como stdin de otro y encadenar programas. Aquí solo usarás | como canalización, y |& para canalizar el error estándar hacia otro comando…
#Canalizar la salida del concatenador para verlo de forma paginada y ordenada conduciendo la stdout de cat a la stdin de less cat prueba | less #Localizar todos los nombres de directorios y archivos que contengan a canalizando la salia de ls a la entrada de grep usado como filtro ls -l | grep -i a #Puedes encadenar los que quieras, por ejemplo: cat nombre | grep -v prueba | sort - r
Para complementar las tuberías, tienes dos herramientas que debes aprender:
- tee: permite enviar la salida de información tanto a la salida estándar como a los ficheros. Si no existe el fichero especificado lo crea. Su propio nombre te da una idea de lo que hace…
#Esto llevará la salida de ls canalizada a tee y éste lo almacena en dos ficheros llamado dato y otro, y a su vez lo muestra por la stdout. Con la opción -a añade la información al final del fichero sin borrar lo que contenía previamente: ls | tee -a dato.txt otro.txt #Este cuenta el número de líneas de ejemplo, agrega el resultado al final del prueba.txt y muestra a su vez el número de líneas en la stdout wl -l ejemplo | tee -a prueba.txt
- xargs: es capaz de construir un comando a partir de su entrada, dicho de otro modo, usa la salida de un comando como argumentos para otro comando.
#Por ejemplo, el "simpático" Windows crea los dichosos thumbs.db en los medios de almacenamiento. Normalmente hay tantos que es imposible ir uno a uno eliminando. Pero, con xargs puedes hacer que find los encuentre y pase las localizaciones como argumentos para un rm y así se puedan eliminar todos de una forma automática: find ./ -name "thumbs.db" | xargs rm