control del flujo stdout stdin y stderr
Control del flujo stdout, stdin y stderr
Section titled “Control del flujo stdout, stdin y stderr”1. Concepto básico
Section titled “1. Concepto básico”Cada proceso en Linux arranca con 3 canales de comunicación abiertos, identificados por un número llamado file descriptor (FD):
| FD | Nombre | Función | Por defecto |
|---|---|---|---|
0 |
stdin | Entrada de datos | Teclado |
1 |
stdout | Salida normal | Pantalla |
2 |
stderr | Salida de errores | Pantalla |
stdout y stderr salen ambos por pantalla, pero son canales distintos. Por eso se pueden redirigir por separado.
2. Ejemplos de cada flujo
Section titled “2. Ejemplos de cada flujo”stdout: resultado normal de un comando.
bash
echo "Hola, mundo!"stdin: datos que recibe el programa, ya sea del teclado, de un archivo o de otro comando.
bash
read -p "Ingresa tu nombre: " nombrestderr: mensajes de error.
bash
ls archivo_inexistente# ls: no se puede acceder a 'archivo_inexistente': No existe el archivo o el directorio3. Operadores de redirección
Section titled “3. Operadores de redirección”| Operador | Qué hace | Ejemplo |
|---|---|---|
> |
Redirige stdout a un archivo (sobrescribe) | ls > lista.txt |
>> |
Redirige stdout a un archivo (añade al final) | ls >> lista.txt |
2> |
Redirige stderr a un archivo | ls noexiste 2> errores.txt |
2>&1 |
Envía stderr al mismo sitio que stdout | cmd > todo.txt 2>&1 |
< |
Usa un archivo como stdin | sort < nombres.txt |
| |
Conecta el stdout de un comando con el stdin de otro | ls | grep ".txt" |
4. /dev/null: el agujero negro
Section titled “4. /dev/null: el agujero negro”/dev/null es un archivo especial que descarta todo lo que se escribe en él. Sirve para silenciar salidas.
Ocultar solo errores:
bash
ls archivo_inexistente 2>/dev/nullOcultar solo la salida normal:
bash
ls >/dev/nullOcultar todo (stdout + stderr):
bash
comando >/dev/null 2>&1Equivalente en Bash (más corto, pero no funciona en sh puro):
bash
comando &>/dev/null5. Ojo con el orden: >/dev/null 2>&1
Section titled “5. Ojo con el orden: >/dev/null 2>&1”Las redirecciones se leen de izquierda a derecha:
bash
comando >/dev/null 2>&1 # Correcto: stdout -> null, y stderr -> donde apunta stdout (null)comando 2>&1 >/dev/null # Distinto: stderr -> pantalla (donde apuntaba stdout), stdout -> nullEn el segundo caso los errores siguen saliendo por pantalla. 2>&1 significa “copia el destino actual de stdout”, así que importa qué destino tenga en ese momento.
6. Ejemplos prácticos
Section titled “6. Ejemplos prácticos”Buscar archivos sin ruido de “Permiso denegado”:
bash
find / -name "*.conf" 2>/dev/nullGuardar la salida y los errores en archivos separados:
bash
nmap 10.10.10.5 > scan.txt 2> errores.txtGuardar todo en un único log:
bash
./script.sh > log.txt 2>&1Ver la salida por pantalla y guardarla a la vez:
bash
nmap 10.10.10.5 | tee scan.txtEjecutar en segundo plano sin generar salida:
bash
./script.sh >/dev/null 2>&1 &