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. 😀


6 comentarios

  1.   eliotime3000 dijo

    Interesante. Gracias a tus tutoriales es que me está gustando Bash mucho más.

  2.   Quincy Magoo dijo

    Estimado, interesante, sin embargo tienes un error en la siguiente linea:

    “y al redireccionar el archivo al comando ls”, deberia ser “y al redireccionar el archivo al comando sort”.

    Un saludo.

  3.   Miguel dijo

    Hay un error al comienzo del texto, cuando indicas el comando “ls”, debería ser “sort”:
    “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 (aquí sería sort)”

    Un saludo y gracias por compartir tu trabajo

  4.   roader dijo

    Esto es genial para los cron , en las que quieres que la salida sea desechada (/dev/null) pero los errores sean guardados en ficheros . Ademas , cuando hago esto , suelo usar el comando date para especificar en que momento exacto fallaron .

    Bash (sh) tiene estas herramientas tan desarrolladas por aquello de la filosofia Unix “haz una cosa , y hazla bien”

  5.   Lolo dijo

    Pues yo no me he enterao de ná

    1.    Vozidea dijo

      Jaja pues está explicado bastante bien, ¿qué no has entendido?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.