Flujo de datos en Linux
Table of Contents
ToggleIntroducción
En sistemas Linux ingresamos las órdenes a través de un teclado, una vez ejecutada dicha orden, generará dos posibles salidas:
- Si la orden se ejecutó correctamente, obtendremos una salida estándar, caso contrario, si el flujo de datos tomara como salida la del error estándar.
- El objeto por el que visualizaremos esa salida suele ser por defecto, la pantalla o monitor. Y el medio por el que podremos verlo, será la Shell de comandos o terminal. Así es como se comporta el flujo de datos a través de las Redirecciones.
Estos conocimientos son fundamentales para cualquier tipo de trabajo en Linux. En el nivel intermedio lo estaremos usando bastante.
Tipos de Redirecciones
Hay tres tipos de redirecciones a tener en cuenta:
STDIN (0): Entrada Estándar
STOUT (1): Salida Estándar
STERR (2): Salida Estándar de error
Entrada estándar (STDIN)
La entrada estándar se utiliza para tomar el contenido de un archivo a un comando.
En el siguiente ejemplo hay un archivo que se llama desordenado.txt el cual contiene números desordenados:
Al ejecutar el comando sort < desordenado.txt pasa el contenido del archivo desordenado.txt al comando sort, el cual mostrará el resultado a través del STDOUT.
También se puede redirigir la salida a un archivo:
De esta manera el resultado ordenado por el comando sort es guardado en el archivo ordenado.txt
Salida estándar (STDOUT)
La salida estándar es la salida normal de un comando. De manera predeterminada esta salida se muestra en la terminal del usuario
Al ejecutar ls el resultado se muestra en pantalla. Por tanto, la salida de un comando se puede redireccionar a un archivo con la ayuda del signo mayor “ > ” como se ve en el siguiente ejemplo:
Esto generará un archivo llamado salida.txt el cual contendrá el resultado del comando ls. Para verificarlo se podemos realizar cat salida.txt. Si el archivo “salida.txt” ya existiera, el contenido sería sobreescrito con el resultado de la redirección. Es decir, se borra el resultado anterior y se coloca la nueva salida.
Para poder agregar contenido al final del archivo, sin sobreescribir el contenido existente, se puede utilizar doble signo mayor “ >> ” como se ve en el ejemplo:
Como se puede ver el archivo incrementó su tamaño (De 60 a 120, justamente el doble), esto se debe a que ejecutamos dos veces el comando ls con >> lo cual agregó el resultado del ls , manteniendo el contenido del primero.
Salida error (STDERR)
La salida estándar de Error, es la salida de un comando que no terminó de manera satisfactoria. Por ejemplo:
$ls –z
ls: invalid option — z
Try `ls –help’ for more information.
Al ejecutar el comando ls con una opción incorrecta, el error se muestra en pantalla de manera normal. En este caso, va a cambiar el tratamiento para poder redirigir el resultado a un archivo.
La salida de error de un comando se puede redireccionar a un archivo con un 2 y signo mayor “ 2> ” como se ve en el siguiente ejemplo:
$ls -z 2> error.txt
Al igual que con la salida estándar, en caso de que el archivo error.txt no exista lo creará, y en caso de existir lo sobreescribirá. Para mantener el contenido sin sobreescribirlo se utiliza “ 2>> ”
Con esto se puede diferenciar en distintos archivos ambas salidas de un mismo comando:
$ls archivo_inexistente* 1>salida.txt 2>error.txt
En este ejemplo el error mostrado por el archivo que no existe será guardado en error.txt mientras que el resultado del asterisco se guardará en salida.txt
Otra opción es redireccionar ambas salidas a un mismo archivo:
$ls archivo_inexistente* >ambos.txt 2>&1
En este caso lo que se hace es redireccionar la salida a ambos.txt luego con el 2>&1 se está redirigiendo el resultado del STDERR (que tiene asociado el número 2) al STDOUT (que tiene asociado el número 1).
Es importante recordar el orden en el que se redirige el contenido. Al final se agrega la redirección de STDERR a STDOUT.
Tener en cuenta
El flujo de datos más utilizado en sistemas Linux con respecto a la salida de error, suele ser el siguiente:
$ls -l archivos* 2>/dev/null
En este caso, todos los archivos existentes en el directorio serán impresos en pantalla vía el comando ls. Sin embargo, aquellos con salidas de error serán redirigidos a /dev/null. Dicho archivo (/dev/null) tiene una propiedad exclusiva, es decir, siempre está vacío. Por tanto, todos los datos enviados allí serán descartados. Esta función es útil cuando se ejecuta un programa, o algún comando, que genera una salida que deseamos ignorar, como pueden ser mensajes de error o de «Permiso denegado».