Redirección de flujos de datos

LinuxBeginner
Practicar Ahora

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.