¿Qué son stdin, stdout y stderr en Linux?

stdin, stdouty stderr son tres flujos de datos creados al iniciar un comando de Linux. Puede usarlos para saber si sus scripts están siendo canalizados o redirigidos. Te mostramos cómo.

Las transmisiones unen dos puntos

Tan pronto como comience a aprender sobre Linux y los sistemas operativos similares a Unix, se encontrará con los términos stdin, stdouty stederr. Estos son tres flujos estándar que se establecen cuando se ejecuta un comando de Linux. En informática, un flujo es algo que puede transferir datos. En el caso de estos flujos, esos datos son texto.

Los flujos de datos, como los flujos de agua, tienen dos extremos. Tienen una fuente y un flujo de salida. Cualquiera que sea el comando de Linux que esté utilizando proporciona un extremo de cada flujo. El otro extremo está determinado por el shell que lanzó el comando. Ese extremo se conectará a la ventana del terminal, se conectará a una tubería o se redirigirá a un archivo u otro comando, de acuerdo con la línea de comandos que lanzó el comando.

Las transmisiones estándar de Linux

En Linux, stdin es el flujo de entrada estándar. Esto acepta texto como entrada. La salida de texto del comando al shell se entrega a través del stdout Flujo de salida (estándar). Los mensajes de error del comando se envían a través del stderr (error estándar) stream.

Para que pueda ver que hay dos flujos de salida, stdout y stderr, y un flujo de entrada, stdin. Debido a que los mensajes de error y la salida normal tienen cada uno su propio conducto para llevarlos a la ventana del terminal, se pueden manejar independientemente el uno del otro.

Las transmisiones se manejan como archivos

Las transmisiones en Linux, como casi todo lo demás, se tratan como si fueran archivos. Puede leer texto de un archivo y puede escribir texto en un archivo. Ambas acciones implican un flujo de datos. Por lo tanto, el concepto de manejar un flujo de datos como un archivo no es tan exagerado.

A cada archivo asociado a un proceso se le asigna un número único para identificarlo. Esto se conoce como el descriptor de archivo. Siempre que se requiera realizar una acción en un archivo, el descriptor de archivo se utiliza para identificar el archivo.

Estos valores siempre se utilizan para stdin, stdout, y stderr:

  • : stdin
  • 1: stdout
  • 2: stderr

Reacción a tuberías y redirecciones

Para facilitar la introducción de alguien a un tema, una técnica común es enseñar una versión simplificada del tema. Por ejemplo, con la gramática, se nos dice que la regla es “I antes de E, excepto después de C”. Pero en realidad, hay Hay más excepciones a esta regla que hay casos que la obedecen.

En una línea similar, cuando se habla de stdin, stdouty stderr es conveniente trotar el axioma aceptado de que un proceso ni sabe ni le importa dónde terminan sus tres corrientes estándar. ¿Debería importarle a un proceso si su salida va al terminal o se redirige a un archivo? ¿Puede incluso saber si su entrada proviene del teclado o si se está canalizando desde otro proceso?

En realidad, un proceso lo sabe, o al menos puede averiguarlo, si decide verificarlo, y puede cambiar su comportamiento en consecuencia si el autor del software decide agregar esa funcionalidad.

Podemos ver este cambio en el comportamiento muy fácilmente. Pruebe estos dos comandos:

ls

ls | cat

El ls command se comporta de manera diferente si su salida (stdout) se está canalizando a otro comando. Lo es ls que cambia a una salida de una sola columna, no es una conversión realizada por cat. Y ls hace lo mismo si su salida está siendo redirigida:

ls > capture.txt

cat capture.txt

Redireccionamiento de stdout y stderr

Hay una ventaja de tener mensajes de error entregados por una transmisión dedicada. Significa que podemos redirigir la salida de un comando (stdout) a un archivo y sigue siendo ver los mensajes de error (stderr) en la ventana del terminal. Puede reaccionar a los errores si es necesario, a medida que ocurren. También evita que los mensajes de error contaminen el archivo que stdout ha sido redirigido a.

Escriba el texto siguiente en un editor y guárdelo en un archivo llamado error.sh.

#!/bin/bash

echo "About to try to access a file that doesn't exist"
cat bad-filename.txt

Haga que el script sea ejecutable con este comando:

chmod +x error.sh

La primera línea del script hace eco del texto a la ventana del terminal, a través del stdout corriente. La segunda línea intenta acceder a un archivo que no existe. Esto generará un mensaje de error que se entrega a través de stderr.

Ejecute el script con este comando:

./error.sh

Podemos ver that ambos flujos de salida, stdout y stderr, se han mostrado en las ventanas del terminal.

Intentemos redirigir la salida a un archivo:

./error.sh > capture.txt

El mensaje de error que se entrega a través de stderr se sigue enviando a la ventana del terminal. Podemos comprobar el contenido del archivo para ver si el stdout la salida fue al archivo.

cat capture.txt

El resultado de stdin se redirigió al archivo como se esperaba.

El > El símbolo de redirección funciona con stdout por defecto. Puede utilizar uno de los descriptores de archivos numéricos para indicar qué flujo de salida estándar desea redirigir.

Para redirigir explícitamente stdout, utilice esta instrucción de redirección:

1>

Para redirigir explícitamente stderr, utilice esta instrucción de redirección:

2>

Intentemos nuestra prueba de nuevo, y esta vez usaremos 2>:

./error.sh 2> capture.txt

El mensaje de error se redirige y el stdout echo se envía un mensaje a la ventana del terminal:

Te puede ser útil:  Cómo ver una lista de restaurantes que has visitado en Google Maps

Veamos qué hay en el archivo de captura.txt.

cat capture.txt

El stderr el mensaje está en captura.txt como se esperaba.

Redireccionamiento de stdout y stderr

Seguramente, si podemos redirigir cualquiera de los dos stdout o stderr a un archivo independientemente el uno del otro, ¿deberíamos poder redirigirlos a ambos al mismo tiempo, a dos archivos diferentes?

Sí, podemos. Este comando dirigirá stdout a un archivo llamado capture.txt y stderr a un archivo llamado error.txt.

./error.sh 1> capture.txt 2> error.txt

Debido a que ambos flujos de salida (salida estándar y error estándar) se redirigen a archivos, no hay salida visible en la ventana del terminal. Volvemos al símbolo del sistema como si nada hubiera ocurrido.

Vamos a comprobar el contenido de cada archivo:

cat capture.txt
cat error.txt

Redireccionamiento de stdout y stderr al mismo archivo

Eso es genial, tenemos cada uno de los flujos de salida estándar que van a su propio archivo dedicado. La única otra combinación que podemos hacer es enviar ambos stdout y stderr al mismo archivo.

Podemos conseguirlo con el siguiente comando:

./error.sh > capture.txt 2>&1

Vamos a desglosar eso.

  • ./error.sh: inicia el archivo de script error.sh.
  • > captura.txt: Redirige el stdout transmitir al archivo capture.txt. > es la abreviatura de 1>.
  • 2>&1: Utiliza la instrucción de redireccionamiento &>. Esta instrucción le permite decirle al shell que haga que una transmisión tenga el mismo destino que otra. En este caso, estamos diciendo “redirigir el flujo 2, stderr, al mismo destino que la corriente 1, stdout, está siendo redirigido a”.

No hay salida visible. Eso es alentador.

Revisemos el archivo de captura.txt y veamos qué hay en él.

cat capture.txt

Tanto el stdout y stderr las secuencias se han redirigido a un único archivo de destino.

Para que la salida de una secuencia se redirija y se deseche silenciosamente, dirija la salida a /dev/null.

Detección de redirección dentro de un script

Discutimos cómo un comando puede detectar si alguna de las transmisiones está siendo redirigida, y puede optar por alterar su comportamiento en consecuencia. ¿Podemos lograr esto en nuestros propios guiones? Sí, podemos. Y es una técnica muy fácil de entender y emplear.

Escriba el texto siguiente en un editor y guárdelo como input.sh.

#!/bin/bash

if [ -t 0 ]; then

  echo stdin coming from keyboard
 
else

  echo stdin coming from a pipe or a file
 
fi

Utilice el siguiente comando para que sea ejecutable:

chmod +x input.sh

La parte inteligente es la prueba entre corchetes. El -t La opción (terminal) devuelve true (0) si el archivo asociado al descriptor de archivo termina en la ventana de terminal. Hemos utilizado el descriptor de archivo 0 como argumento para la prueba, que representa stdin.

Si stdin está conectado a una ventana de terminal, la prueba resultará verdadera. Si stdin si está conectado a un archivo o una tubería, la prueba fallará.

Podemos usar cualquier archivo de texto conveniente para generar entrada al script. Aquí estamos usando uno llamado dummy.txt.

./input.sh < dummy.txt

La salida muestra que el script reconoce que la entrada no proviene de un teclado, sino de un archivo. Si lo desea, podría variar el comportamiento de su script en consecuencia.

Eso fue con una redirección de archivos, probémoslo con una tubería.

cat dummy.txt | ./input.sh

El script reconoce que su entrada se está canalizando hacia él. O más precisamente, reconoce una vez más que el stdin la secuencia no está conectada a una ventana de terminal.

Ejecutemos el script sin canalizaciones ni redirecciones.

./input.sh

El stdin stream está conectado a la ventana del terminal y el script informa de ello en consecuencia.

Para comprobar lo mismo con el output stream, necesitamos un nuevo script. Escriba lo siguiente en un editor y guárdelo como output.sh.

#!/bin/bash

if [ -t 1 ]; then

echo stdout is going to the terminal window
 
else

echo stdout is being redirected or piped
 
fi

Utilice el siguiente comando para que sea ejecutable:

chmod +x input.sh

El único cambio significativo en este script está en la prueba entre corchetes. Estamos usando el dígito 1 para representar el descriptor del archivo para stdout.

Vamos a probarlo. Canalizaremos la salida a través de cat.

./output | cat

El script reconoce que su salida no va directamente a una ventana de terminal.

También podemos probar el script redirigiendo la salida a un archivo.

./output.sh > capture.txt

No hay salida a la ventana del terminal, se nos devuelve silenciosamente al símbolo del sistema. Como era de esperar.

Podemos mirar dentro del archivo de captura.txt para ver qué se capturó. Utilice el siguiente comando para hacerlo.

cat capture.sh

De nuevo, la sencilla prueba en nuestro script detecta que el stdout la secuencia no se envía directamente a una ventana de terminal.

Si ejecutamos el script sin ninguna canalización o redirección, debería detectar que stdout se está entregando directamente en la ventana del terminal.

./output.sh

Y eso es exactamente lo que vemos.

Corrientes de Conciencia

Saber cómo saber si sus scripts están conectados a la ventana del terminal, o una tubería, o si están siendo redirigidos, le permite ajustar su comportamiento en consecuencia.

El registro y la salida de diagnóstico pueden ser más o menos detallados, dependiendo de si va a la pantalla o a un archivo. Los mensajes de error se pueden registrar en un archivo diferente al resultado normal del programa.

Como suele ser el caso, más conocimiento trae más opciones.

¿Qué tan útil te resultó el artículo?

¡Haz click en una estrella para valorar!

Valoración media / 5. Votos totales:

¡No hay votos hasta ahora! Sé el primero en valorar este artículo.

Utilizamos cookies para personalizar el contenido y los anuncios, para ofrecer funciones de redes sociales y para analizar nuestro tráfico. También compartimos información sobre su uso de nuestro sitio con nuestros socios de redes sociales, publicidad y análisis. View more
Cookies settings
Aceptar
Política de privacidad y cookies
Privacy & Cookies policy
Cookie name Active
El presente Política de Privacidad establece los términos en que Alternativa.click usa y protege la información que es proporcionada por sus usuarios al momento de utilizar su sitio web. Esta compañía está comprometida con la seguridad de los datos de sus usuarios. Cuando le pedimos llenar los campos de información personal con la cual usted pueda ser identificado, lo hacemos asegurando que sólo se empleará de acuerdo con los términos de este documento. Sin embargo esta Política de Privacidad puede cambiar con el tiempo o ser actualizada por lo que le recomendamos y enfatizamos revisar continuamente esta página para asegurarse que está de acuerdo con dichos cambios.

Información que es recogida

Nuestro sitio web podrá recoger información personal por ejemplo: Nombre,  información de contacto como  su dirección de correo electrónica e información demográfica. Así mismo cuando sea necesario podrá ser requerida información específica para procesar algún pedido o realizar una entrega o facturación.

Uso de la información recogida

Nuestro sitio web emplea la información con el fin de proporcionar el mejor servicio posible, particularmente para mantener un registro de usuarios, de pedidos en caso que aplique, y mejorar nuestros productos y servicios.  Es posible que sean enviados correos electrónicos periódicamente a través de nuestro sitio con ofertas especiales, nuevos productos y otra información publicitaria que consideremos relevante para usted o que pueda brindarle algún beneficio, estos correos electrónicos serán enviados a la dirección que usted proporcione y podrán ser cancelados en cualquier momento. Alternativa.click está altamente comprometido para cumplir con el compromiso de mantener su información segura. Usamos los sistemas más avanzados y los actualizamos constantemente para asegurarnos que no exista ningún acceso no autorizado.

Cookies

Una cookie se refiere a un fichero que es enviado con la finalidad de solicitar permiso para almacenarse en su ordenador, al aceptar dicho fichero se crea y la cookie sirve entonces para tener información respecto al tráfico web, y también facilita las futuras visitas a una web recurrente. Otra función que tienen las cookies es que con ellas las web pueden reconocerte individualmente y por tanto brindarte el mejor servicio personalizado de su web. Nuestro sitio web emplea las cookies para poder identificar las páginas que son visitadas y su frecuencia. Esta información es empleada únicamente para análisis estadístico y después la información se elimina de forma permanente. Usted puede eliminar las cookies en cualquier momento desde su ordenador. Sin embargo las cookies ayudan a proporcionar un mejor servicio de los sitios web, estás no dan acceso a información de su ordenador ni de usted, a menos de que usted así lo quiera y la proporcione directamente. Usted puede aceptar o negar el uso de cookies, sin embargo la mayoría de navegadores aceptan cookies automáticamente pues sirve para tener un mejor servicio web. También usted puede cambiar la configuración de su ordenador para declinar las cookies. Si se declinan es posible que no pueda utilizar algunos de nuestros servicios.

Enlaces a Terceros

Este sitio web pudiera contener en laces a otros sitios que pudieran ser de su interés. Una vez que usted de clic en estos enlaces y abandone nuestra página, ya no tenemos control sobre al sitio al que es redirigido y por lo tanto no somos responsables de los términos o privacidad ni de la protección de sus datos en esos otros sitios terceros. Dichos sitios están sujetos a sus propias políticas de privacidad por lo cual es recomendable que los consulte para confirmar que usted está de acuerdo con estas. Control de su información personal En cualquier momento usted puede restringir la recopilación o el uso de la información personal que es proporcionada a nuestro sitio web.  Cada vez que se le solicite rellenar un formulario, como el de alta de usuario, puede marcar o desmarcar la opción de recibir información por correo electrónico.  En caso de que haya marcado la opción de recibir nuestro boletín o publicidad usted puede cancelarla en cualquier momento. Esta compañía no venderá, cederá ni distribuirá la información personal que es recopilada sin su consentimiento, salvo que sea requerido por un juez con un orden judicial. Alternativa.click Se reserva el derecho de cambiar los términos de la presente Política de Privacidad en cualquier momento.
Save settings
Cookies settings