Introducción
Normalmente, los comandos de Linux leen la entrada desde el terminal y escriben los resultados en él. El intérprete de comandos puede conectar esos flujos de datos con archivos u otros comandos. Esto se denomina redirección y constituye la base del registro, las tuberías, los trabajos en segundo plano y los scripts de shell.
En este laboratorio, trabajará con la entrada estándar, la salida estándar y el error estándar. Aprenderá cuándo > sobrescribe, cuándo >> agrega contenido, cómo 2> y 2>&1 gestionan los errores, cómo una tubería transfiere datos, cómo tee muestra y guarda la misma salida, y cuándo resulta útil /dev/null.
Comprender la entrada, la salida y el error estándar
En este paso, creará un archivo de entrada pequeño y lo conectará con comandos mediante la entrada estándar.
Todos los comandos comienzan con tres flujos estándar:
| Descriptor | Nombre | Conexión predeterminada |
|---|---|---|
0 |
entrada estándar, o stdin | teclado |
1 |
salida estándar, o stdout | terminal |
2 |
error estándar, o stderr | terminal |
Cree y acceda a un espacio de trabajo:
mkdir -p /home/labex/project/streams-lab
cd /home/labex/project/streams-lab
Cree un archivo de entrada de tres líneas con un documento aquí. El shell envía a cat las líneas situadas entre los dos marcadores EOF, mientras que > guarda la salida de cat en input.txt:
cat > input.txt <<'EOF'
alpha
beta
gamma
EOF
Normalmente, cat input.txt recibe un nombre de archivo como argumento. En cambio, el operador < conecta el archivo con el descriptor 0, la entrada estándar:
cat < input.txt
Debería ver las tres líneas. Use la misma redirección de entrada con wc -l, que cuenta las líneas:
wc -l < input.txt
La salida debe ser 3. Como el nombre del archivo no se proporciona como argumento a wc, solo se muestra el número.
Redirigir y agregar contenido a la salida estándar
En este paso, redirigirá la salida normal de los comandos y observará la diferencia entre sobrescribir y agregar contenido.
Asegúrese de encontrarse en el espacio de trabajo de los flujos:
cd /home/labex/project/streams-lab
El operador > conecta el descriptor 1, la salida estándar, con un archivo. Crea el archivo o trunca su contenido existente antes de escribir:
echo "Stream report" > report.txt
cat report.txt
Realice otra sobrescritura para comprobar que la línea anterior desaparece:
echo "Input lines: 3" > report.txt
cat report.txt
Ahora use >>, que abre el destino en modo de adición:
echo "Status: complete" >> report.txt
cat report.txt
El archivo debe contener exactamente dos líneas: Input lines: 3, seguida de Status: complete. El shell realiza la redirección antes de iniciar el comando.
Separar la salida estándar del error estándar
En este paso, ejecutará un comando que produce tanto una salida normal como un error y, después, guardará cada flujo en un archivo diferente.
El siguiente comando ls recibe una ruta existente y otra inexistente:
cd /home/labex/project/streams-lab
ls -l input.txt missing.txt
La línea que describe input.txt pertenece a stdout. El mensaje No such file or directory pertenece a stderr. De forma predeterminada, ambos aparecen en el terminal, pero son flujos separados.
Redirija el descriptor 1 con > y el descriptor 2 con 2>:
ls -l input.txt missing.txt > listing.log 2> errors.log
El comando seguirá devolviendo un estado de salida distinto de cero porque falta una de las rutas, pero el shell quedará listo para ejecutar el siguiente comando. Inspeccione los destinos:
cat listing.log
cat errors.log
listing.log debe mencionar input.txt sin incluir el error. errors.log debe mencionar missing.txt y el error, sin incluir la lista del archivo encontrado.
Combinar la salida estándar y el error estándar
En este paso, enviará stdout y stderr a un único registro y aprenderá por qué el orden de las redirecciones es importante.
Primero redirija stdout a combined.log y, después, dirija el descriptor 2 al destino actual del descriptor 1:
cd /home/labex/project/streams-lab
ls -l input.txt missing.txt > combined.log 2>&1
La expresión 2>&1 significa «enviar el descriptor 2 al mismo destino que utiliza actualmente el descriptor 1». Como > combined.log aparece primero, ambos flujos llegan al archivo.
cat combined.log
El archivo debe contener tanto la lista de input.txt como el error de missing.txt.
Bash también admite &> como forma abreviada de redirigir ambos flujos:
ls -l report.txt absent.txt &> shorthand.log
cat shorthand.log
Este segundo archivo debe contener la lista correcta de report.txt y el error de absent.txt. La forma portable > file 2>&1 es especialmente común en scripts y comandos de servicios.
Ver y guardar la salida de una tubería con Tee
En este paso, utilizará una tubería y tee para mostrar la salida mientras guarda los mismos datos en un archivo.
Una tubería, escrita como |, conecta stdout del comando situado a la izquierda con stdin del comando situado a la derecha. Ordene el archivo de entrada alfabéticamente en orden inverso:
cd /home/labex/project/streams-lab
sort -r input.txt
Con una redirección de salida normal, las líneas ordenadas se envían a un archivo y dejan de aparecer en el terminal:
sort -r input.txt > sorted.txt
cat sorted.txt
El comando tee copia su stdin tanto a stdout como a un archivo indicado por nombre. Ejecute el mismo ordenamiento mediante una tubería:
sort -r input.txt | tee sorted.txt
Debería ver las líneas ordenadas en pantalla y sorted.txt debe recibir el mismo contenido. De forma predeterminada, tee sobrescribe su destino, igual que >.
La opción -a hace que tee agregue contenido. Añada una línea más mientras la muestra:
echo "delta" | tee -a sorted.txt
cat sorted.txt
El archivo debe contener ahora gamma, beta, alpha y delta. tee resulta útil cuando necesita ver los datos en el terminal en tiempo real y guardar un registro simultáneamente.
Descartar datos innecesarios con Dev Null
En este paso, descartará intencionadamente un flujo con /dev/null, conservará la salida útil mediante tee y vaciará un registro existente.
/dev/null es un dispositivo especial que acepta y descarta todo lo que se escribe en él. Enumere un directorio real y otro inexistente mientras descarta únicamente stderr:
cd /home/labex/project/streams-lab
ls -l . missing-directory 2> /dev/null
Debería ver la lista del directorio, pero no el error de missing-directory. Combine esta operación con tee para guardar también la salida visible de stdout:
ls -l . missing-directory 2> /dev/null | tee visible-listing.log
La tubería transporta únicamente stdout. stderr se redirigió por separado a /dev/null antes de que la tubería recibiera los datos.
Inspeccione la lista guardada:
cat visible-listing.log
Por último, cree un registro temporal desechable y use /dev/null como fuente de entrada vacía para borrar su contenido. Un archivo separado conserva la evidencia de los flujos combinados del paso 4:
echo "outdated scratch data" > scratch.log
cat /dev/null > scratch.log
Compruebe su tamaño:
ls -l scratch.log
El archivo debe seguir existiendo y tener un tamaño de 0 bytes. Use el descarte de forma deliberada: ocultar errores puede dificultar la resolución de problemas cuando realmente necesita información de diagnóstico.
Resumen
Ha practicado los tres flujos estándar y sus descriptores de archivo, ha conectado archivos con stdin mediante < y ha redirigido stdout con > y >>. También ha separado stderr con 2>, lo ha combinado con stdout mediante 2>&1 y &>, y ha aprendido por qué el orden de los operadores es importante.
Además, ha comparado la redirección normal a archivos con las tuberías y tee, ha utilizado tee -a para agregar contenido mientras mostraba la salida y ha descartado datos innecesarios con /dev/null. Estos patrones le ayudarán más adelante a comprender los registros, los comandos en segundo plano y los scripts de shell.



