Curso de Linux / Entrada y salida estándar: redirecciones y tuberías en Bash

Los comandos de shell generalmente tienen tres canales llamados entrada estándar (stdin), salida estándar (stdout) y error estándar (stderr). En Bash, < envía un archivo como entrada, > y >> envían la salida normal a un archivo, y 2> envía los errores a un archivo. | conecta la salida de un comando a la entrada del siguiente comando. Saber a dónde se dirige cada canal también permite explicar por qué el resultado no se muestra en la pantalla.

Aquí se aborda a qué archivo o comando se dirige la entrada, salida y error estándar. Las condiciones de ejecución de && y || para elegir el siguiente comando según éxito o fallo se explican por separado en flujo de ejecución del shell.

Distinguiendo los tres flujos estándar

Los tres descriptores de archivos estándar que un proceso puede usar inicialmente en el shell también se expresan con números. Generalmente están conectados al teclado y la pantalla, pero pueden cambiar a otros destinos según redirecciones o tuberías.

Número Nombre Rol principal
0 Entrada estándar (stdin) Datos que lee el comando
1 Salida estándar (stdout) Resultado normal
2 Error estándar (stderr) Mensajes de diagnóstico y error

Aunque las dos salidas se vean juntas en la terminal, son canales diferentes. Por eso, si solo guardamos el resultado normal con >, los mensajes de error aún pueden aparecer en pantalla. Los números son importantes para entender las indicaciones como 2> que se adjuntan en la línea de comandos.

Crear un archivo de práctica

Los ejemplos de este curso se basan en Bash. Si linux-course-14-practice ya existe en el directorio de inicio, elija otro nombre. Si no pudo crear un nuevo directorio, no ejecute el siguiente comando. > vaciará y sobrescribirá el contenido si el archivo ya existe.

mkdir ~/linux-course-14-practice
cd ~/linux-course-14-practice
pwd

Después de verificar la ubicación, guarde dos líneas, y añada una línea mediante >>. >> sigue el método de agregar al final del archivo.

printf 'alpha\nbeta\n' > source.txt
printf 'gamma\n' >> source.txt
cat source.txt

La salida final es, en orden, alpha, beta, gamma. Antes de decidir si guardar la cadena mostrada en pantalla en un archivo o anexarla al archivo existente, elija un operador.

Proporcionar un archivo como entrada o guardar resultados normales

< conecta el archivo a la entrada estándar. wc -l < source.txt proporciona un flujo de entrada en lugar de pasar el nombre del archivo como argumento, por lo que solo muestra el número 3. Por otro lado, wc -l source.txt normalmente también muestra el nombre del archivo después del número.

wc -l < source.txt

Para guardar la salida normal en un archivo separado, use >. Después del siguiente comando, ninguna línea coincidente aparecerá en la pantalla y beta se guardará en matches.txt.

grep 'beta' source.txt > matches.txt
cat matches.txt

Verifique si cat matches.txt imprime beta. Los archivos de redirección se abren antes de ejecutar el comando, por lo que si se escribe incorrectamente > en un archivo importante existente, se puede perder el contenido original.

Tratar el canal de errores por separado

Si se consulta un archivo que no existe, ls enviará un mensaje de diagnóstico al error estándar. El siguiente comando guarda solo los errores en errors.txt. Se asume que en una nueva carpeta de práctica absent-14.txt no existe.

ls absent-14.txt 2> errors.txt
cat errors.txt

El mensaje de error varía según la configuración regional, pero debe mostrar que no existe el archivo. Para combinar la salida normal y el error en un solo archivo, en Bash se escribe como COMANDO > all.txt 2>&1. 2>&1 hace que el error estándar utilice el destino que tiene la salida estándar en ese punto de la secuencia de redirecciones.

ls absent-14.txt > all.txt 2>&1
cat all.txt

La redirección se procesa de izquierda a derecha, por lo que invertir el orden con 2>&1 > all.txt no produce el mismo resultado. En el caso invertido, el error puede permanecer en la pantalla, que es el destino original de la salida estándar.

Conectar dos comandos con una tubería

La tubería | envía la salida estándar del comando de la izquierda a la entrada estándar del comando de la derecha. El siguiente ejemplo busca líneas que contengan beta y cuenta el número de esas líneas.

grep 'beta' source.txt | wc -l

En el archivo de práctica aparece 1. Las tuberías por defecto no envían el error estándar de la izquierda. Además, el estado final predeterminado de la tubería en Bash es el estado del último comando, por lo que incluso si no hay coincidencias en grep, si wc -l imprime correctamente 0, el estado total puede ser éxito. Si es importante saber si hubo fallas en varios pasos, se deben considerar métodos adicionales de verificación, como la configuración pipefail de Bash.

La redirección cambia el canal de un archivo o comando, y la tubería conecta comando con comando. Cuando el resultado no es el esperado, ejecute cada comando por separado para verificar primero si el valor proviene de la salida normal o del error.

Documentación oficial

El documento de redirección de GNU Bash explica <·>·2> y el orden de procesamiento, mientras que el documento de pipelines de GNU Bash describe la conexión de pipes y el estado de salida.