Noticia Viernes de Terminal: Standard Stream

Bienvenidos a otro viernes más…

Es tiempo de conocer una minúscula parte de la terminal. Después de mucho pensarlo me decidí a crear un post acerca de las standard streams; aunque será superficial, creo que es algo que todos deben conocer.

Standard Stream


Standard Stream está compuesto por varios canales de comunicación entre el usuario y la terminal. Estos “canales” Input/Output (Entrada/Salida) muestran o capturan información cuando un comando es ejecutado.


Diagrama rapido sobre los standard streams.


Las 3 conexiones I/O son: stdin Standard input, stdout Standar output, stderr Standard error.

stdin: Standard input


La entrada estándar es la forma en la que capturamos información de un comando, ya sea por medio de pipes, redirección, teclado, etc. Lo identificamos con el descriptor de archivo 0.

El descriptor es un indicador para acceder -en este caso- a los canales de entrada y salida. Estos son valores int, por lo general 0, 1 y 2.

Un ejemplo de stdin seria:

sort < listado

Toma toda la información que se encuentra en listado -en este caso los números escritos de manera aleatoria-, y al redireccionar el archivo al comando ls, éste ordena alfabéticamente la lista numérica. En este ejemplo los indicadores están implícitos.

stdout: Standard output


La salida estándar, como su nombre lo indica, muestra la salida de un comando por medio de la consola. Si escribimos ls toda la información que nos muestra en pantalla es la salida estándar. Es representada por el descriptor 1.

Ahora intentaré ejemplificar stdin y stdout con un script escrito en bash, simplemente porque me encanta bash hahaha. :)

test.sh

#!/bin/bash

if [ -t 0 ]; then
echo "Estas usando stdout"
elif [ -t 1 ]; then
echo "Estas usando stdin"
else
echo "Error brutal"
fi


Ahora una captura de pantalla que demuestra cómo utilizar el script. Al redireccionar o usar un pipe con el script usa test -t para saber si sólo se ejecuta el script stdout, y si no obviamente es stdin.

bash test.sh
ls | bash test.sh
bash test.sh < /etc/passwd

El script en cuestión y sus salidas…


Recuerden modificar el comando y practicar así aprenden.

stderr: Standard error


El Error estándar es la manera en la que los programas muestran errores o diagnósticos. Es representado por el descriptor 2.

Para entender el concepto, ésta es la situación: cuando queremos guardar un error de un comando lo primero en que pensamos es redireccionar la salida a un texto plano.

ls > info.txt

Esto funcionaría, la información del comando se almacenará en un archivo de texto plano. Pero al momento de guardar el error, no lo almacena, si no que lo muestra en pantalla y el archivo de texto plano está vació.

En cambio si usamos 2> para indicar que guarde stderr en el archivo:

ls foo 2> info.txt

Ahora sí guardara la información del error en el archivo de texto.

La mayoría de las Shell permiten almacenar stderr y stdout en un solo comando comando con &> donde Foo es un directorio inexistente

ls Descargas Foo &> info.txt

Este fichero contendrá la información del error al ejecutar ls en Foo y listará los directorios dentro de Descargas.

Y para finalizar ¿Que significa ese famoso 2>&1?

Simple, redirige stderr a stdout. Ese & en medio de > y 1 significa que redireccionará a stdout. Si no estuviera ahí seria algo como… “redirecciona el error hacia el archivo 1″.

Y con esto es posible redireccionar:

  • stdout a un archivo
  • stderr a un archivo
  • stdout a stderr
  • stderr a stdout
  • stderr y stdout a un archivo
  • entre otros

Eso es todo por hoy gente. Nos leemos y gracias por pasar. :D

The post Viernes de Terminal: Standard Stream appeared first on Desde Linux.


KtxD7egZKkA


Continúar leyendo...