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

What Are Stdin Stderr



Siempre que ejecute cualquier comando en la terminal, stdin , stderr , y stdout son tres flujos de datos que crea bash. Si está familiarizado con la línea de comandos, es posible que ya haya aprovechado estas funciones. Básicamente, permiten canalizar / redirigir datos de un comando a otro.

Veamos cómo stdin , stderr , y stdout funciona y cómo puede utilizarlos también.







stdin, stdout y stderr

En informática, el término flujo se refiere a algo que puede transferir datos. Aquí, los tres flujos llevan texto como datos.



Al igual que las corrientes de agua, las corrientes de datos también tienen dos puntos finales. Hay una fuente y una salida. Cualquier comando que esté ejecutando en la terminal estará en cualquier punto de la transmisión. Con la transmisión, puede conectar dos ventanas de terminal, dos comandos diferentes e incluso archivos.



Analicemos rápidamente las transmisiones especiales.





  • stdin: Significa entrada estándar. Toma texto como entrada.
  • stdout: significa salida estándar. La salida de texto de un comando se almacena en el flujo de salida estándar.
  • stderr: significa error estándar. Siempre que un comando enfrenta un error, el mensaje de error se almacena en esta secuencia.

En Linux, casi todas las transmisiones se tratan como si fueran archivos. Al igual que puede leer / escribir un archivo, puede leer / escribir datos de estos flujos.

Una forma sencilla de acceder a cualquier archivo es mediante el número de descriptor de archivo exclusivo asociado a él. En el caso de estos streams, hay valores únicos asignados a cada uno de ellos.



  • 0: stdin
  • 1: salida estándar
  • 2: stderr

stdin, stdout y stderr en acción

Comencemos aprendiendo más sobre estas transmisiones a través de la acción, comenzaremos con stdin.

Ejecute el siguiente comando.

$leer

El comando requerirá entrada desde el teclado. Aquí, la herramienta de lectura obtiene la entrada de stdin. Ahora echemos un vistazo a stdout.

Ejecute el comando primero.

$ls -los

Aquí, el comando ls enumera los archivos en el directorio actual. La lista se envía a stdout y el terminal lo imprime. Revisemos stderr ahora.

Hay diferentes formas en que puede ocurrir un error. Para este ejemplo, enviar a ls un argumento inválido resultará en un error.

$ls -loscualquier cosa

Aquí, no hay ningún archivo con nombre. Es por eso que el mensaje que devuelve ls se envía a stderr .

Tubería

Esta es una técnica común que aprovecha al máximo las transmisiones stdin y stdout. Expliquémoslo con un ejemplo.

$echo 'Hola Mundo' | sujeciónHola

Aquí, el | el letrero es responsable de la tubería. La salida echo genera está escrito en el stdout Arroyo. Luego, la tubería redirige el contenido de stdout a stdin para el comando grep. Así es como grep sabe en qué contenido realizar la operación.

Si desea canalizar tanto stderr como stdout al siguiente comando, utilice | & en su lugar.

$echoHola Mundo|& gato

$cualquier cosa|& gato

Redirigir transmisiones

Ahora que sabemos cómo funcionan estas transmisiones, veamos cómo puede redirigirlas. La canalización es una forma de redirección. Sin embargo, solo involucra stdin y stdout. Bash permite un control específico sobre los tres flujos.

Para redirigir el contenido de stdout a un archivo, agregue el> ángulo seguido del nombre del archivo de destino.

$echoHola Mundo>hola.txt

Aquí, la salida del comando echo se almacenará en el archivo hello.txt.

Si el archivo ya existe, el comando anterior lo sobrescribirá. Para evitarlo, asegúrese de que el nombre del archivo sea único. Si no desea sobrescribir, puede usar >> en su lugar. Agrega la salida al final del archivo de destino.

$echo 'Hola Mundo' >>hola.txt

El objetivo de stdin es trabajar con input. Esto también se puede redirigir. Por ejemplo, en lugar de escribir la entrada desde el teclado, se puede cargar desde un archivo.

En este comando, cat tomará su entrada directamente del archivo hello.txt.

$gato <hola.txt

Veamos la redirección con un ejemplo diferente. Esta vez, involucrará una secuencia de comandos de Python.

$# pyin.py
$ nombre= aporte('Ingrese su nombre orte')
$Email = aporte('Ingrese correo electrónico orte')
$impresión('Tu nombre es% s y tu correo electrónico es% s'%(nombre, Email))

La entrada para el script se encuentra en hello.txt.

$gatohola.txt

Enviemos el archivo como entrada para la secuencia de comandos.

$ python3 pyin.py <Hola.TXT

Curiosamente, puede redirigir tanto stdin y stdout en la misma línea de comando. Aquí, el siguiente comando usará hello.txt como stdin y envía el stdout del comando a un archivo.

$ python3 pyin.py <Hola.TXT >producción.TXT

Redirigir stderr es similar a stdout. Sin embargo, debe mencionar el ID de descripción 2 para indicar stderr. De lo contrario, solo usará stdout.

Aquí, redirigiré el contenido del stderr a un archivo de texto.

$cualquier cosa2>error.txt

Redirigir Stdout y Stderr

Sí, es posible redirigir a ambos simultáneamente. Todo lo que necesita es mencionar la descripción ID 1 y 2 antes de la redirección.

$echoHola Mundo1>output.log2>registro de depuración

Pensamientos finales

stdin , stdout , y stderr son características maravillosas que ofrece bash por defecto. Si te gustan las secuencias de comandos bash, usarlas puede ser increíblemente útil en situaciones complicadas.

¿Quiere obtener más información sobre las secuencias de comandos de bash? Empecemos con esto guía para principiantes sobre scripts bash !

¡Disfrutar!