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.
Índice
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.
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.
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
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, deja el tuyo
Interesante. Gracias a tus tutoriales es que me está gustando Bash mucho más.
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.
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
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»
Pues yo no me he enterao de ná
Jaja pues está explicado bastante bien, ¿qué no has entendido?