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.
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. ๏
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?