Redirecciones y tuberías
Cuando ejecutamos comandos, cada uno puede recibir datos (entrada) y producir datos (salida). El shell nos permite redirigir esas entradas y salidas para encadenar procesos.
1. Conceptos básicos #
Cada comando trabaja con flujos de datos (streams):
| Flujo | Descriptor | Descripción |
|---|---|---|
| STDIN | 0 | Entrada estándar (por defecto, teclado) |
| STDOUT | 1 | Salida estándar (por defecto, pantalla) |
| STDERR | 2 | Salida de errores estándar |
👉 Podemos decirle a un comando de dónde leer (entrada) y a dónde enviar lo que produce (salida).
2. Redirecciones de salida #
Sobrescribir un archivo: > #
Escribe la salida en un archivo (borra el contenido anterior):
1echo "Hola mundo" > salida.txt
👉 Si salida.txt existía, se sobreescribe.
Añadir al final de un archivo: >> #
Agrega contenido sin borrar lo que ya existe:
1echo "Nueva línea" >> salida.txt
3. Redirecciones de error #
Algunos comandos generan errores en STDERR (2). Por defecto los ves en pantalla, pero puedes redirigirlos:
1ls /no-existe 2> errores.txt
👉 El error se guarda en errores.txt.
Para guardar salida normal y errores juntos:
1comando > todo.txt 2>&1
O en Bash moderno:
1comando &> todo.txt
4. Redirecciones de entrada #
Puedes hacer que un comando lea datos desde un archivo en lugar del teclado:
1sort < nombres.txt
5. Heredoc << #
Sirve para enviar un bloque de texto como entrada al comando.
Ejemplo:
1cat << EOF 2Hola 3Este texto 4viene de un heredoc 5EOFSalida de consola Hola Este texto viene de un heredoc
6. Here-string <<< #
Envía una sola línea como entrada:
1wc -w <<< "Hola mundo shell"Salida de consola 3
(El texto tiene 3 palabras).
7. Tuberías | #
Las tuberías permiten encadenar comandos: la salida de uno es la entrada del siguiente.
1ls /etc | grep conf
👉 ls lista archivos, y grep filtra los que contienen “conf”.
8. Ejemplo práctico #
Crea un script llamado log_info.sh que:
- Guarde la lista de procesos en
procesos.txt. - Guarde solo los que contengan la palabra
bashenbash_procesos.txt. - Cuente cuántas líneas tiene el archivo filtrado y lo muestre en pantalla.
- Guarde los errores (si los hubiera) en
errores.txt.
💡 Pistas:
- Usa
ps auxpara listar procesos. - Usa tubería
|congrep. - Usa
wc -lpara contar líneas.
Ejemplo de solución: #
1#!/usr/bin/env bash 2 3 # Guardar lista completa de procesos 4ps aux > procesos.txt 2> errores.txt 5 6 # Filtrar solo los procesos con 'bash' 7grep bash procesos.txt > bash_procesos.txt 2>> errores.txt 8 9 # Contar los procesos bash 10NUM=$(wc -l < bash_procesos.txt) 11 12echo "Número de procesos bash: $NUM"
Ejecución:
1chmod +x log_info.sh 2./log_info.sh
Salida esperada (varía según el sistema):
Número de procesos bash: 3
9. Buenas prácticas #
- Redirige errores siempre → así evitas mensajes molestos en pantalla y puedes depurar.
- Usa
>>para logs → no pierdes el historial. - Con tuberías largas, lee de izquierda a derecha → cada paso transforma los datos.
- Para textos grandes, usa
lessohead/tailpara ver partes.
10. Ejercicio final del módulo #
Crea un script llamado resumen_logs.sh que:
- Tome todos los archivos
.logde la carpeta actual. - Guarde en
errores.txttodas las líneas que contengan la palabraERROR. - Cuente cuántos errores hay en total.
- Muestre el resultado en pantalla y lo añada a un archivo
reporte_final.txt.
1#!/usr/bin/env bash 2 # Buscar líneas con ERROR en todos los .log 3grep "ERROR" *.log > errores.txt 2>/dev/null 4 5 # Contar cuántas líneas hay 6cantidad=$(wc -l < errores.txt) 7 8 # Mensaje final 9mensaje="Se encontraron $cantidad errores en los logs" 10 11 # Mostrar por pantalla 12echo "$mensaje" 13 14 # Guardar en reporte_final.txt 15echo "$mensaje" >> reporte_final.txtSalida de consola Se encontraron 0 errores en los logs
Resumen del tema
Conceptos clave #
- Descriptores de Archivo Estándar:
0(STDIN - entrada),1(STDOUT - salida estándar) y2(STDERR - salida de errores). - Operadores de Redirección:
>(sobrescribir STDOUT),>>(añadir al final de STDOUT).2>(redirigir STDERR),2>&1o&>(unificar STDOUT y STDERR en un mismo destino).<(redirigir STDIN desde archivo).
- Bloques Heredoc (
<< EOF) y Here-strings (<<<): inyección directa de bloques multilínea o cadenas únicas a la entrada estándar de un comando. - Tuberías (Pipes
|): interconexión en cascada de la salida STDOUT de un proceso con la entrada STDIN del siguiente comando (ps aux | grep bash | wc -l).
Qué debes recordar #
Las tuberías (|) encadenan procesos conectando STDOUT con STDIN, mientras que 2>&1 o &> permiten capturar errores (STDERR) junto a la salida estándar.