Fundamentos de la línea de comandos
Teoría: Flujos
Cuando empezamos a programar, uno de los primeros temas que encontramos es cómo mostrar y recibir información. Cada lenguaje tiene su manera, pero al final, todos hacen lo mismo: usan canales que el sistema operativo ya tiene listos para que podamos comunicar nuestros programas con el mundo exterior. Vamos a descubrir cómo funciona eso, paso a paso.
¿Cómo se imprime algo en pantalla?
Imprimir algo en pantalla es decirle al programa: “muéstrame esto”. Cada lenguaje lo hace con su propia función. Mira algunos ejemplos:
Aunque la forma de escribir "muéstrame esto" cambia, por debajo todos usan lo mismo: lo que llamamos la salida estándar o STDOUT.
¿Qué son STDOUT, STDIN y STDERR?
Cuando el sistema operativo ejecuta un programa, le proporciona tres canales predeterminados:
STDOUT: Salida estándar
Cuando escribimos algo como:
El texto "Hola mundo" se muestra en pantalla porque echo está enviando esa información al flujo STDOUT, y el sistema operativo luego lo presenta en nuestra terminal.
❓ ¿Y si en vez de ver el resultado en pantalla lo quieres guardar?
Acá es donde entra la redirección.
Redirigir STDOUT a un archivo
Podemos usar el símbolo > para que lo que se muestra en pantalla se guarde en un archivo:
Este comando crea un archivo llamado lista.txt con el resultado del ls -la. Para verlo:
¿Qué hace cada símbolo?
Ejemplo:
Salida:
Primera línea
Segunda línea
STDIN: Entrada estándar
Así como podemos enviar información a un archivo, también podemos recibirla desde uno. Por ejemplo, el comando wc (word count) cuenta líneas, palabras o caracteres:
El símbolo < le dice al comando wc que tome su entrada desde archivo.txt en vez de que el usuario la escriba manualmente.
Combinando entrada y salida
También podemos usar ambos símbolos juntos para procesar datos:
Así, el número de líneas de archivo.txt se guarda en resultado.txt.
STDERR: Manejo de errores
Hay situaciones donde un comando falla, y el mensaje de error que aparece no es parte de la salida normal, sino que se envía a otro canal: STDERR.
Probemos este comando:
Resultado:
ls: cannot access 'carpeta_que_no_existe': No such file or directory
Ahora:
¿Y qué pasó?
- El error apareció en pantalla.
- El archivo
salida.txtestá vacío.
¿La razón? El símbolo > solo redirige STDOUT, no STDERR. El error sigue yendo a la pantalla.
Redirigiendo STDERR
Cada flujo tiene un número asociado:
Entonces, si queremos enviar solo los errores a un archivo:
Redirigir todos los flujos juntos
Si queremos capturar tanto los mensajes normales como los de error en un solo archivo, tenemos dos opciones:
Opción 1: Redirigir STDOUT y luego STDERR al mismo destino
La parte 2>&1 significa: redirige STDERR al mismo lugar que STDOUT.
⚠️ El orden importa. Este no funciona igual:
Opción 2: Atajo para redirigir ambos flujos
Este atajo es lo mismo que hacer > archivo 2>&1.
Redirigir un flujo específico
Si quieres trabajar sólo con los errores o sólo con la salida, puedes usar los números directamente:
También puedes hacer que el error se muestre como salida normal redirigiéndolo a STDOUT:
Resumen
Principales formas de redireccionar flujos en Bash:
Esta base te permitirá entender cómo los programas se comunican en el entorno del sistema operativo y, lo más importante, te dará herramientas para depurar y entender el comportamiento de tus programas cuando hagas scripts o experimentos usando la terminal.