La Línea de Comandos en 10 Minutos

La terminal parece hostil porque no te da nada que clickear. A cambio, te da algo mejor: cada acción se convierte en una frase, y las frases se pueden repetir, combinar y automatizar. Esta página es la gramática — más las traducciones de los tres errores que hacen que los principiantes cierren el portátil.

🎙️ Publicado y grabado:

01El modelo: verbo, flags, objeto

Cada comando es una frase corta: un verbo (el programa), flags que lo modifican (normalmente empiezan con -), y el objeto sobre el que actúa. Esa es toda la gramática. Cuando veas un one-liner aterrador en internet, es solo este patrón, tres veces, pegado.

ls  -l  /tmp
│   │   └── objeto: qué directorio
│   └────── flag: "formato largo" (más detalle)
└────────── verbo: listar archivos

# las dos salvavidas, siempre disponibles:
ls --help        # resumen rápido de cualquier comando
man ls           # el manual completo (q para salir)

03Archivos: copiar, mover, borrar — sin papelera

Cuatro verbos: mkdir, cp, mv (que también es "renombrar" — mover a un nombre nuevo), y rm. Ahora la frase que hay que decir sin rodeos: rm no usa papelera de reciclaje. No hay undo, no hay restaurar, no hay "eliminados recientemente". Es el comando más honesto del sistema.

mkdir notes             # crear un directorio
cp report.txt backup.txt   # copiar
mv report.txt final.txt    # renombrar (es lo mismo que mover)
mv final.txt notes/        # mover de verdad

rm old.txt              # borrar un archivo. PARA SIEMPRE.
rm -r old_project/      # borrar una carpeta y todo lo que contiene
El desastre famoso
rm -rf / y sus primos (un espacio de más: rm -rf ~ /tmp borra tu home) son como terminan carreras. Dos defensas que funcionan: nunca uses -f por reflejo — existe para silenciar avisos que deberías leer; y antes de cualquier rm con comodín, ejecuta ls con el mismo patrón primero para ver exactamente qué va a morir. ls *.log, mira, y luego rm *.log.

04Leer archivos sin abrir un editor

Rara vez necesitas un editor solo para mirar. cat vuelca un archivo, less te deja navegar por él, head/tail muestran los extremos. El que se siente como un superpoder: tail -f sigue un archivo de log en vivo — viendo errores aparecer mientras los usuarios los provocan.

cat config.yml          # volcar el archivo entero
less huge.log           # navegar cómodamente (q sale, / busca)
head -20 data.csv       # primeras 20 líneas — revisar columnas de un CSV
tail -50 app.log        # últimas 50 líneas — donde está el crash
tail -f app.log         # verlo crecer, en vivo. Ctrl+C para parar

05grep: encontrar la aguja

grep imprime las líneas que coinciden con un patrón. Eso es todo — y es suficiente para responder "dónde está el error", "dónde está este setting", "dónde en el código se usa esta función". Tres flags hacen el 95% del trabajo: -i (ignorar mayúsculas), -r (buscar en carpetas recursivamente), -n (mostrar números de línea).

grep "ERROR" app.log            # líneas que contienen ERROR
grep -i "timeout" app.log       # sin importar mayúsculas
grep -rn "api_key" src/         # buscar en toda una carpeta, con números de línea
grep -c "ERROR" app.log         # solo contar las coincidencias
grep -v "DEBUG" app.log         # invertir: líneas SIN el patrón

06Pipes: toda la filosofía en un carácter

El carácter | alimenta la salida de un comando como entrada del siguiente. Esta es toda la filosofía de la terminal: herramientas pequeñas que hacen una sola cosa, conectadas como segmentos de manguera. Compones respuestas a preguntas para las que nadie escribió un programa.

# "¿cuáles son los 5 errores más comunes en este log?"
grep "ERROR" app.log | sort | uniq -c | sort -rn | head -5
#      encuéntralos    agrupa líneas iguales, cuenta,
#                      ordena por conteo desc, top 5

# > guarda la salida en un archivo (SOBREESCRIBE), >> añade al final
grep "ERROR" app.log > errors.txt
echo "new line" >> notes.txt
La trampa de >
> sobreescribe el archivo destino antes de que el comando se ejecute. Lo que significa que grep "x" data.txt > data.txt — filtrar un archivo hacia sí mismo — lo vacía al instante. El shell trunca data.txt primero, luego grep lee el archivo ahora vacío. Escribe a un nombre nuevo, luego mv de vuelta.

07PATH: por qué "command not found" después de instalar

Cuando escribes python, el shell busca en una lista de carpetas — el PATH — en orden, y ejecuta la primera coincidencia. Ese es todo el mecanismo. Y explica el error más confuso para principiantes: instalaste una herramienta, el instalador la puso en una carpeta que no está en la lista, y el shell honestamente reporta que no la encuentra.

$ mytool
bash: mytool: command not found

echo $PATH               # la lista, separada por dos puntos
which python             # ¿qué carpeta ganó para este comando?

# la solución: añadir la carpeta de la herramienta a la lista (en ~/.bashrc o ~/.zshrc)
export PATH="$HOME/.local/bin:$PATH"
# luego reinicia la terminal — o:  source ~/.bashrc
El ritual que todos olvidan
Editaste ~/.bashrc, y nada cambió — porque ese archivo solo se ejecuta cuando una terminal arranca. Abre una terminal nueva o ejecuta source ~/.bashrc en esta. "Editar, olvidar hacer source, concluir que la solución no funcionó, probar algo peor" es un rito de paso; sáltatelo.

08Permisos: qué quiere "denied" realmente

Cada archivo tiene un propietario y un conjunto de interruptores: quién puede leer, escribir, ejecutar. Permission denied significa que un interruptor está apagado para ti — nada está roto. Dos reglas honestas: usa sudo solo cuando la tarea es genuinamente de todo el sistema, y trata chmod 777 como la respuesta incorrecta que casualmente calla el error.

$ ./deploy.sh
bash: ./deploy.sh: Permission denied

ls -l deploy.sh          # -rw-r--r--  ← no hay 'x': no es ejecutable
chmod +x deploy.sh       # activar el interruptor de ejecución
./deploy.sh              # ejecuta ✓

sudo apt install nginx   # sudo = hazlo como administrador
Opinión honesta
El consejo malo favorito de Stack Overflow es sudo chmod -R 777 . — "hazlo todo escribible por todos". "Funciona" como quitar la puerta de tu casa "arregla" perder las llaves. Si una herramienta específica sigue necesitando sudo en tu propio directorio home, algo está mal instalado — arregla la propiedad (chown), no abras los interruptores.

09Matar procesos: Ctrl+C y amigos

Los programas se cuelgan. Los puertos quedan ocupados. Aquí está la escalera: Ctrl+C para educadamente lo que tienes delante; kill le pide a un proceso en segundo plano que se cierre; kill -9 deja de pedir. Y el clásico diario — "port already in use" — se arregla en dos líneas.

Ctrl+C                   # parar el comando actual (la mayoría de veces)
Ctrl+D                   # "terminé de escribir" / salir del shell

Error: listen EADDRINUSE: address already in use :3000
lsof -i :3000            # ¿quién está ocupando el puerto 3000? → muestra PID
kill 12345               # pedir amablemente (PID de arriba)
kill -9 12345            # dejar de pedir (último recurso — no hace cleanup)

10Chuleta

Organizada por la frase que tienes en la cabeza.

# "¿dónde estoy / qué hay aquí / ir allí?"
pwd · ls -la · cd folder · cd .. · cd -

# "¿qué va a borrar este comodín?"  (mira ANTES de rm)
ls *.log    # luego, y solo luego:  rm *.log

# "¿qué hay en este archivo?"
less file    # q sale, / busca

# "ver el log en vivo"
tail -f app.log

# "¿dónde aparece X en este proyecto?"
grep -rn "X" .

# "top 5 errores más comunes"
grep "ERROR" log | sort | uniq -c | sort -rn | head -5

# "command not found (pero lo instalé)"
echo $PATH · which cmd · añadir carpeta al PATH, source ~/.bashrc

# "permission denied en mi script"
chmod +x script.sh

# "port already in use"
lsof -i :3000 → kill <PID>

Ese es un vocabulario funcional. El cambio más profundo: la terminal convierte "cosas que hago" en "frases que puedo guardar" — y las frases guardadas se convierten en scripts, y los scripts en automatización. Esa es la verdadera razón por la que todo desarrollador acaba aquí. Donde viven Git y Python: justo en esta terminal — Git y Python son las lecturas naturales siguientes.