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:

LenguajeCódigo
JavaScriptconsole.log('Hello!');
Pythonprint('Hello!')
JavaSystem.out.print("Hello!");

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:

NombreSignificadoFunción principal
STDOUTSalida estándarMostrar resultados del programa
STDINEntrada estándarRecibir datos del usuario o archivo
STDERRError estándarMostrar mensajes de error

STDOUT: Salida estándar

Cuando escribimos algo como:

echo "Hola mundo"

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:

ls -la > lista.txt

Este comando crea un archivo llamado lista.txt con el resultado del ls -la. Para verlo:

cat lista.txt

¿Qué hace cada símbolo?

SímboloFunción
>Sobrescribe el archivo con la nueva salida
>>Agrega al final del archivo sin borrar nada

Ejemplo:

echo "Primera línea" > archivo.txt   # Sobrescribe
echo "Segunda línea" >> archivo.txt  # Agrega
cat archivo.txt

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:

wc -l < archivo.txt

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:

wc -l < archivo.txt > resultado.txt
cat resultado.txt

Así, el número de líneas de archivo.txt se guarda en resultado.txt.

Proceso de redirección


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:

ls carpeta_que_no_existe

Resultado:

ls: cannot access 'carpeta_que_no_existe': No such file or directory

Ahora:

ls carpeta_que_no_existe > salida.txt

¿Y qué pasó?

  • El error apareció en pantalla.
  • El archivo salida.txt está 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:

FlujoNúmero
STDIN0
STDOUT1
STDERR2

Entonces, si queremos enviar solo los errores a un archivo:

ls carpeta_que_no_existe 2> errores.txt
cat errores.txt

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

ls carpeta_que_no_existe > todo.txt 2>&1
cat todo.txt

La parte 2>&1 significa: redirige STDERR al mismo lugar que STDOUT.

⚠️ El orden importa. Este no funciona igual:

ls carpeta_que_no_existe 2>&1 > todo.txt

Opción 2: Atajo para redirigir ambos flujos

ls carpeta_que_no_existe &> todo.txt
cat todo.txt

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:

cd carpeta_que_no_existe 2> error.txt

También puedes hacer que el error se muestre como salida normal redirigiéndolo a STDOUT:

cd carpeta_que_no_existe 2>&1

Resumen

Principales formas de redireccionar flujos en Bash:

AcciónComando
Redirigir STDOUT a un archivocomando > archivo
Agregar a un archivocomando >> archivo
Redirigir STDERR a un archivocomando 2> archivo
Capturar STDOUT y STDERR juntoscomando > archivo 2>&1
Redirigir ambos de forma abreviadacomando &> archivo
Usar archivo como entrada (STDIN)comando < archivo

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.