File Descriptors and Redirections - Linux Fundamentals
Objetivo
Comprender cómo Linux maneja los flujos de datos a través de file descriptors y dominar las técnicas de redirección para controlar la entrada, salida y errores de los comandos.
Introducción
En Linux, cada proceso tiene tres canales de comunicación estándar: entrada, salida y errores. Conocer cómo manipular estos canales es fundamental para automatizar tareas, crear scripts eficientes y manejar datos en pipelines complejos.
Escenario
Estás auditando un servidor Linux y necesitas: 1. Ejecutar comandos sin mostrar errores de permisos 2. Guardar resultados en archivos para análisis posterior 3. Conectar múltiples comandos para procesar datos
Ejercicios Prácticos
Ejercicio 1: Contar Archivos de Log
Objetivo: Determinar cuántos archivos .log existen en el sistema.
find / -type f -name "*.log" 2>/dev/null | wc -lResultado:
32
Respuesta: 32
Explicación de componentes:
| Componente | Función |
|---|---|
find / |
Busca desde la raíz |
-type f |
Solo archivos |
-name "*.log" |
Extensión .log |
2>/dev/null |
Descarta errores |
wc -l |
Cuenta líneas |
Ejercicio 2: Contar Paquetes Instalados
Objetivo: Determinar el total de paquetes instalados.
dpkg -l | grep -c "^ii"Resultado:
737
Respuesta: 737
¿Por qué grep -c "^ii"?
El formato de dpkg -l incluye: - Headers (líneas de encabezado) - Paquetes con diferentes estados
El patrón ^ii filtra solo paquetes correctamente instalados: - Primer i = “instalado” - Segundo i = “correctamente configurado”
Conceptos Teóricos
File Descriptors Estándar
| FD | Nombre | Descripción | Default |
|---|---|---|---|
| 0 | STDIN | Entrada estándar | Teclado |
| 1 | STDOUT | Salida estándar | Terminal |
| 2 | STDERR | Errores | Terminal |
Operadores de Redirección
# STDOUT a archivo (sobrescribe)
comando > archivo.txt
# STDOUT a archivo (añade)
comando >> archivo.txt
# STDERR a archivo
comando 2> errores.txt
# Descartar errores
comando 2>/dev/null
# STDOUT y STDERR separados
comando 1> salida.txt 2> errores.txt
# STDOUT y STDERR al mismo archivo
comando &> todo.txt
# STDIN desde archivo
comando < entrada.txtHere Documents
# Crear archivo con múltiples líneas
cat << EOF > config.yml
database:
host: localhost
port: 5432
EOFPipes y Encadenamiento
# Pipe simple
cat archivo.txt | grep "error"
# Múltiples pipes
cat access.log | grep "404" | wc -l
# Con tee (ver y guardar)
comando | tee salida.txt | grep "patrón"Casos de Uso Prácticos
Buscar Sin Errores de Permisos
find / -name "*.conf" 2>/dev/null
find /etc/ -type f -perm 777 2>/dev/nullGuardar y Contar Resultados
find / -name "*.log" 2>/dev/null | tee logs.txt | wc -lFiltrar y Procesar
# Encontrar archivos grandes
find / -type f -size +100M 2>/dev/null | sort -k2
# Buscar contenido en archivos
grep -r "password" /var/ 2>/dev/null | head -20Análisis de Logs
# Contar errores por tipo
cat /var/log/syslog | grep -i error | cut -d' ' -f5 | sort | uniq -c
# Ver logs en tiempo real con filtro
tail -f /var/log/syslog | grep --line-buffered "error"Estados de Paquetes dpkg
| Código | Estado |
|---|---|
ii |
Instalado correctamente |
rc |
Eliminado, configs presentes |
un |
No instalado |
in |
Instalación pendiente |
hn |
Half-installed |
Comandos de Gestión de Paquetes
# Listar instalados
dpkg -l | grep "^ii"
# Buscar paquete
dpkg -l | grep nginx
# Información del paquete
dpkg -s nginx
# Archivos del paquete
dpkg -L nginx
# Qué paquete instaló un archivo
dpkg -S /usr/bin/nginx¿Qué Aprendimos?
- File Descriptors: 0, 1, 2 son STDIN, STDOUT, STDERR
- Redirección:
>sobrescribe,>>añade - Silenciar errores:
2>/dev/nulles esencial - Pipes: Conectan comandos en cadenas eficientes
- dpkg: Usar
grep "^ii"para contar solo instalados
Autoevaluación
- ¿Cuál es la diferencia entre
>y>>? - ¿Qué hace
2>&1? - ¿Cómo guardarías STDOUT y STDERR en el mismo archivo?
- ¿Por qué
dpkg -l | wc -lno da el número correcto de paquetes? - ¿Qué es un “here document” y cuándo usarlo?