Aprendiendo fontanería básica en Linux – Uso de Redirecciones y Pipes

Si has empezado a manejar la consola de tu distribución Linux, a leer los man de sus comandos y a escribir –help antes de utilizar uno de estos, es porque definitivamente estás picado con él. A muchos les asusta el hecho de que el ordenador se comunique con ellos en modo texto, en vez de rodeado de deliciosas y suaves ventanitas. Al fin y al cabo, con las ventanas todo es más cómodo, no?

A veces sí, pero… no siempre.
El entorno en modo texto, la interfaz de comandos o Shell hace de tu Linux un sistema operativo muy, muy potente y sobre todo muy flexible.

Pero además permite extender las funcionalidades de las ventanas más allá (y nunca mejor dicho) de lo que en principio alcanza la vista.

Voy a hablaros en este artículo de una particularidad de los entornos Linux las Pipes (o tuberías)

Las tuberías permiten a Linux reenviar la salida de un programa hacia otro programa, existen dos formas de canalizar los resultados de un proceso, comando o programa: Las Redirecciones y Las Tuberías.
Pero antes deberíamos repasar algunos conceptos…

Los ficheros en Linux

En Linux todo es un fichero… ¿Cómo?

Así es, para Linux las entradas, las salidas, la pantalla, la impresora, todo es tratado como si fuese un fichero o archivo. Esto quiere decir que se pueden aplicar a ellos las funciones propias que se le pueden aplicar a un archivo, a saber: propietario, grupo, permisos, abrir, cerrar, leer, escribir, copiar, etc…
Formalmente un fichero informático es una entidad lógica compuesta por una secuencia de bits, almacenada en un sistema de archivos ubicada en la memoria (o almacenamiento) de un ordenador.

Paralelamente existen en modo estándar una entrada y dos salidas (luego comprobaremos que hay o puede haber muchas más, o incluso podemos comprobar que pueden cambiarse) El teclado y la salida por línea de consola (pantalla).

Estos son ficheros abiertos a todos los programas que se ejecutan en el sistema operativo. Y están definidos como:

–          Entrada Estandar (Teclado) :  /dev/stdin

–          Salida Estandar (Pantalla):  /dev/stdout

–          Salida Estandar de Error (Pantalla):  /dev/stderr

Por defecto tanto la entrada como las salidas estándar de los comandos son la propia terminal, a no ser que por la propia naturaleza del comando usemos los nombres de algunos ficheros que hagan el papel de entrada y de salida. Por ejemplo, en el comando:

cp fichero1 fichero2

 

La entrada sería el fichero1 y la salida el fichero2, es decir, tenemos un proceso (programa o comando cp) que hace una copia usando la entrada de datos “fichero1” y terminando el proceso de copia en la salida de datos “fichero2”

Lo que estamos describiendo aquí es ni más ni menos que lo que hace cualquier programa, desde el más simple al más complejo, tomar unos datos (de una entrada) procesarlos y darnos los resultados (a través de su salida)

Redirecciones

Como hemos visto los comandos de Linux tienen una entrada estándar (número 0) y dos salidas estándar (número 1 para la salida normal del comando, y número 2 para la salida de los mensajes de error que se puedan producir en su ejecución).

Sin embargo, cuando utilizamos por ejemplo el comando ls (listado de directorio), la salida de este comando se dirige hacia la salida estándar, la terminal.
Pero podríamos desear que esta salida se redirigiera a un archivo de texto por ejemplo. Imaginemos que nuestro jefe necesita que le demos un listado de todos los archivos del directorio /cuentas. En Linux podríamos hacer lo siguiente:

ls –a /home/contabilidad/cuentas/ > listado1

Es decir, le estamos diciendo al comando ls que nos de la lista de todo (-a) lo que se encuentre en el directorio /home/contabilidad/cuentas/  y que todo eso lo redirija a un archivo llamado listado1

Este archivo se creará en el directorio en el que nos encontremos trabajando… y podemos consultarlo haciendo uso (por ejemplo) del comando cat (os recomiendo que en este punto echéis un vistazo al help del comando cat y/o al man de dicho comando. Tambien debéis recordar que para salir de la ejecución de un comando de consola basta con usar la combinación de teclas CTRL+d , pulsar la tecla “q” o escribir exit)

 

Hemos hecho en una sola línea una redirección, lo que normalmente hubiese salido por la salida estándar, hemos hecho que se desvíe y se guarde en un archivo.

Para ello hemos utilizado el operador  >

El (>) es uno de los llamados operadores de redirección y dirige la salida estándar hacia el fichero indicado a continuación,  si este fichero no existe, se crea en ese momento.

Otros operadores de redirección son:

–          el operador (<): que redirige la entrada estándar desde un determinado fichero. Es decir, deja de usar el teclado como entrada estándar  y usa el fichero indicado.

–          el operador (>>): que redirige la salida estándar hacia otro fichero, pero añadiendo dicha salida al final de ese fichero, (es decir empieza a escribir a partir de la última línea escrita en el fichero) sin sobrescribir el contenido original.

Por ejemplo, si cada vez que entramos en el sistema ejecutamos el comando

date >>registrodelogin

 

Tendremos un fichero llamado registrodelogin que contiene información sobre todas las veces que hemos entrado en el sistema.

Otro ejemplo, si quisiéramos añadir el fichero archivo2 al final de archivo1 y al conjunto llamarle archivo3, haríamos:

cat file1 file2 >file3

 

O, si quisiéramos que el fichero resultante fuera el mismo archivo1:

cat archivo2 >>archivo1

Un ejemplo en redirección de un fichero a la entrada de un programa podría ser:

mail contabilidad <carta

 

que enviaría al usuario contabilidad el contenido del fichero carta.

Tuberías (Pipes)

Siguiendo con los ejemplos anteriores, si quisiéramos enviar a nuestro jefe el listado de archivos que nos pidió, podríamos utilizar la redirección para efectuar algo así:

ls –a /home/contabilidad/cuentas/ > listado1

mail theboss <listado1

rm fichero

Es decir que hemos conectado la salida estándar de ls con la entrada estándar de mail, a través de un fichero transitorio listado1.

Linux permite hacer esta operación directamente, sin pasar por el fichero de  almacenamiento transitorio: esto se hace mediante el concepto de tubería (pipe), que consiste en concatenar la salida estándar de un comando con la entrada estándar de otro. Para el ejemplo anterior simplemente tendríamos que hacer:

ls –a /home/contabilidad/cuentas/  | mail theboss

 

Con el operador de tubería ( | ) se pueden concatenar tantos comandos como deseemos.

Otro ejemplo muy práctico es redirigir la salida de un comando al comando more. Esto es muy útil cuando consultamos ayudas largas sobre un programa o listados especialmente largos. El comando more pagina los resultados por pantalla, y podemos mostrar estos secuencialmente pulsando la barra espaciadora.

sudo ls –a /root | more

Aquí hemos usado previo al comando ls el comando sudo ya que el directorio que estamos intentando listar necesita permisos de root para poder verse.

Bifurcación (comando tee)

A veces interesa que la salida de un comando, además de redirigirse a un determinado fichero, se bifurque también hacia la terminal, con objeto de observar inmediatamente el resultado. Esto se consigue con el operador tee, que podría emplearse de la siguiente  forma:

ls -a | tee archivo1

 

la salida de ls se bifurca hacia la terminal y hacia archivo1.

Si quisiéramos que la salida de este comando se añadiera al final de archivo1, deberíamos utilizar la opción –a (del comando tee)

ls -a | tee -a archivo1

 

Redirección de la salida de errores

Los mensajes de error se dirigen a la salida número 2, que normalmente es también la terminal. A veces, por ejemplo cuando se quiere ejecutar un comando en background (ejecutar un comando en background es lanzar su ejecución y recuperar el control de la terminal sin esperar a que termine, lo cual se hace añadiendo el carácter & al final del comando), interesa evitar que los mensajes de error aparezcan en la pantalla, pues en ella habremos empezado a hacer otra cosa.

Para explicar esto, supongamos que queremos bajar de un servidor ftp una serie de ficheros, podríamos escribir en un archivo el siguiente texto que controlará la conexión. (Lo llamaremos descargaftp)

open linuxcol.uniandes.edu.co

cd /pub/linux/utils

get *

quit

 

Podriamos ahora utilizando, por ejemplo, el programa ncftp escribir la siguiente línea que por un lado, tomará la conexión y los parámetros de descarga del archivo “descargaftp” y por otro, escribirá el resultado en un fichero llamado “ftplog” en el que guardaremos cada paso que efectue nuestra descarga  y por otro los errores que se puedan producir en el archivo “erroresdescarga”

 

ncftp<descargaftp>ftplog 2>erroresdescarga

 

con lo cual la salida 2 (errores) se redirige hacia el fichero erroresdescarga. Si quisiéramos redirigir la salida estándar de errores al mismo fichero que la salida estándar emplearíamos algo como:

ncftp<descagaftp>ftplog 2>&1

En Linux existen otros tipos de tuberías como podrían ser los FIFOs o los sockets, pero la explicación de estos están fuera de este artículo básico…
Podéis saber más visitando el este enlace

6 pensamientos en “Aprendiendo fontanería básica en Linux – Uso de Redirecciones y Pipes

  1. Pingback: Latino » Blog Archive » Comandos básicos en Linux

Deja un comentario