Las cinco lecciones anteriores te han dado el arsenal de comandos; esta te enseña a manejarlo rápido. Puede parecer un tema menor frente a los permisos o las tuberías, pero no lo es: en operaciones, la diferencia entre alguien que teclea cada comando desde cero y alguien que reutiliza, corrige y encadena en segundos se mide en horas de trabajo a la semana. Cuando srv-veloz-01 está caído a las tres de la mañana y necesitas iterar sobre una cadena de filtros hasta dar con la causa, esa velocidad deja de ser comodidad y se convierte en capacidad real de respuesta.
Contenido
- El historial de comandos y
history - Expansión del historial:
!!,!$y compañía - Búsqueda incremental con
Ctrl-R - Configurar el historial:
HISTSIZE,HISTCONTROLy amigos - No dejes contraseñas en el historial
- Edición de línea con readline
- Autocompletado con Tab
- Control de trabajos: primer contacto
- Alias para el día a día de Veloz Envíos
- El historial de comandos y
history
historyBash guarda cada comando que ejecutas en una lista numerada, que al cerrar la sesión vuelca en ~/.bash_history.
Esos números son la clave para reutilizar comandos. Operaciones habituales sobre el historial:
| Comando | Efecto |
|---|---|
history |
Lista todo el historial numerado |
history 20 |
Solo los 20 últimos |
history | grep chmod |
Buscar comandos anteriores que contengan chmod |
history -d 514 |
Borrar una entrada concreta (por ejemplo, una que llevaba una clave) |
history -c |
Vaciar el historial de la sesión actual |
history -a |
Volcar ya al fichero, sin esperar a cerrar la sesión |
Un detalle que sorprende: el historial se escribe al cerrar la sesión, y si tienes varias terminales abiertas, la última en cerrarse puede sobrescribir lo de las demás. La solución se ve en la sección 4.
- Expansión del historial:
!!, !$ y compañía
!!, !$ y compañíaBash puede insertar trozos de comandos anteriores en la línea actual mediante la expansión del historial, que se dispara con !.
| Atajo | Inserta |
|---|---|
!! |
El comando anterior completo |
!n |
El comando número n del historial |
!-2 |
El penúltimo comando |
!cad |
El último comando que empezaba por cad |
!?cad? |
El último comando que contenía cad |
!$ |
El último argumento del comando anterior |
!^ |
El primer argumento del comando anterior |
!* |
Todos los argumentos del comando anterior |
El uso estrella de !! es recuperar un comando que falló por falta de privilegios:
systemctl restart veloz-api # → Failed to restart veloz-api.service: Access denied
sudo !! # se expande a: sudo systemctl restart veloz-apiY !$ ahorra reescribir rutas largas, que es donde más errores se cometen:
ls -l /srv/veloz/datos/historico/2026/08/envios-2026-08-03.csv
head -3 !$ # head -3 /srv/veloz/datos/historico/2026/08/envios-2026-08-03.csvExiste además la sustitución rápida ^viejo^nuevo, que repite el comando anterior cambiando la primera aparición de una cadena:
Es perfecta para corregir una errata sin reescribir la línea. Un consejo de seguridad: con comandos destructivos, añade el modificador :p (de print), que muestra el comando expandido en lugar de ejecutarlo y lo deja en el historial listo para recuperarlo con la flecha arriba. Así, !rm:p te enseña el último comando que empezaba por rm sin llegar a lanzarlo.
- Búsqueda incremental con
Ctrl-R
Ctrl-RLa expansión con ! es potente, pero requiere recordar. Ctrl-R no: abre una búsqueda incremental hacia atrás que va mostrando la coincidencia según escribes.
| Tecla | Acción |
|---|---|
Ctrl-R |
Iniciar la búsqueda, o saltar a la coincidencia anterior |
Ctrl-S |
Ir a la coincidencia siguiente (hacia adelante) |
Enter |
Ejecutar el comando encontrado |
Flecha → o Ctrl-E |
Editarlo antes de ejecutar |
Ctrl-G |
Cancelar y volver a la línea vacía |
Este es probablemente el atajo que más veces usarás en toda tu vida profesional: teclear tres letras de una tubería que escribiste hace dos días y recuperarla entera.
Una advertencia clásica con Ctrl-S: en muchos terminales esa combinación está capturada por el control de flujo XON/XOFF y congela la pantalla en lugar de buscar. Si te ocurre, Ctrl-Q la descongela. Para liberar Ctrl-S de forma permanente, añade stty -ixon a tu ~/.bashrc.
- Configurar el historial:
HISTSIZE, HISTCONTROL y amigos
HISTSIZE, HISTCONTROL y amigosEl comportamiento del historial se ajusta con variables de entorno que se definen en ~/.bashrc (lección 01-02):
| Variable | Qué controla | Valor recomendado |
|---|---|---|
HISTSIZE |
Comandos guardados en memoria durante la sesión | 10000 |
HISTFILESIZE |
Comandos guardados en el fichero ~/.bash_history |
20000 |
HISTCONTROL |
Qué comandos no se guardan | ignoreboth |
HISTIGNORE |
Patrones de comandos a excluir | "ls:cd:pwd:history:exit" |
HISTTIMEFORMAT |
Marca de tiempo en cada entrada | "%F %T " |
HISTCONTROL admite tres valores combinables con ::
ignoredups: no guarda un comando si es idéntico al anterior.ignorespace: no guarda los comandos que empiezan por un espacio.ignoreboth: las dos cosas a la vez. Es la opción habitual.
HISTTIMEFORMAT merece atención especial porque cambia la salida de history añadiendo la fecha de cada comando:
514 2026-08-03 11:22:41 chmod 600 ~/veloz-ops/etc/veloz-ops.conf 515 2026-08-03 11:23:05 ls -l ~/veloz-ops/bin/
Saber cuándo ejecutaste algo es determinante al reconstruir un incidente: permite correlacionar tus acciones con las marcas de tiempo de app.log.
Y la configuración que resuelve el problema de las varias terminales:
shopt -s histappend # añadir al fichero en lugar de sobrescribirlo
PROMPT_COMMAND='history -a' # volcar tras cada comando, no al cerrarCon esas dos líneas en tu ~/.bashrc, cada terminal añade sus comandos al fichero común inmediatamente y ninguna pisa a las demás.
- No dejes contraseñas en el historial
Este apartado es corto y crítico. Todo lo que teclees queda en ~/.bash_history, un fichero de texto plano. Si escribes mysql -u veloz -pMiClaveSecreta123, esa contraseña queda guardada en disco, se sincroniza en las copias de seguridad y la ve cualquiera que acceda a tu cuenta. Tres defensas:
# 1. Anteponer un espacio (requiere HISTCONTROL con ignorespace)
curl -H "Authorization: Bearer TOKEN123" https://api.veloz.local/envios
# 2. Borrar la entrada si ya la escribiste
history -d 514 && history -a
# 3. Mejor aún: que la credencial nunca esté en la línea de comandos
source ~/veloz-ops/etc/veloz-ops.conf # el fichero con permisos 600 de la lección 02-03Fíjate en el espacio inicial de la primera línea: es deliberado, y solo funciona si HISTCONTROL incluye ignorespace. La tercera opción es la correcta a largo plazo, y es la razón por la que en 02-03 protegimos veloz-ops.conf con permisos 600: los secretos viven en un fichero restringido, no en la línea de comandos.
- Edición de línea con readline
Bash usa la librería readline para editar la línea actual, con los mismos atajos que Emacs. Nada de moverte carácter a carácter con las flechas:
| Atajo | Acción |
|---|---|
Ctrl-A / Ctrl-E |
Ir al principio / final de la línea |
Alt-B / Alt-F |
Retroceder / avanzar una palabra |
Ctrl-U |
Borrar desde el cursor hasta el principio |
Ctrl-K |
Borrar desde el cursor hasta el final |
Ctrl-W |
Borrar la palabra anterior |
Alt-D |
Borrar la palabra siguiente |
Ctrl-Y |
Pegar lo último borrado con U, K o W |
Ctrl-_ |
Deshacer el último cambio |
Ctrl-L |
Limpiar la pantalla sin perder la línea que estabas escribiendo |
Ctrl-X Ctrl-E |
Abrir la línea actual en tu editor ($EDITOR) |
Los tres que cambian la vida de verdad:
Ctrl-W+Ctrl-Yfuncionan como cortar y pegar: borras una ruta larga, escribes otra cosa y la recuperas donde quieras.Ctrl-Ues la forma correcta de abortar una línea a medio escribir sin perder el prompt, y también sirve para no ejecutar por error un comando peligroso que ya has tecleado.Ctrl-X Ctrl-Ees la salida de emergencia cuando la tubería que estás componiendo ya no cabe en una línea: se abre envimonano, la editas con comodidad y al guardar y salir, Bash la ejecuta.
- Autocompletado con Tab
Tab completa lo que estás escribiendo. Si hay una única posibilidad, la completa entera; si hay varias, completa la parte común y espera.
Doble Tab muestra todas las opciones posibles cuando hay ambigüedad. Al pulsar Tab dos veces sobre ls .../envios-2026-08-0, Bash lista las tres coincidencias (envios-2026-08-01.csv, -02 y -03) y te deja la línea intacta para que sigas escribiendo.
El completado no se limita a rutas: al principio de la línea completa nombres de comando (incluidos los de ~/veloz-ops/bin, gracias a que está en el PATH desde 01-02), y también completa variables ($HIST<Tab>) y usuarios (~jo<Tab>).
Instalando el paquete bash-completion el sistema aprende a completar opciones y argumentos de cada programa: git che<Tab> propone checkout, systemctl restart vel<Tab> propone los servicios que existen.
Usa Tab siempre, incluso cuando sepas escribir la ruta: además de ser más rápido, es una verificación. Si Tab no completa, esa ruta no existe, y acabas de detectar una errata antes de ejecutar un rm.
- Control de trabajos: primer contacto
Cuando un comando tarda demasiado o quieres recuperar el prompt sin matarlo, entra en juego el control de trabajos:
| Acción | Efecto |
|---|---|
Ctrl-C |
Interrumpe el proceso en primer plano (le envía la señal SIGINT) |
Ctrl-Z |
Suspende el proceso y devuelve el prompt |
jobs |
Lista los trabajos de la sesión y su estado |
fg %1 |
Trae el trabajo 1 a primer plano |
bg %1 |
Lo reanuda en segundo plano |
comando & |
Lanza el comando directamente en segundo plano |
tail -f /var/log/veloz/app.log
# pulsas Ctrl-Z → [1]+ Detenido tail -f /var/log/veloz/app.log
bg %1 # sigue vigilando el log, pero te devuelve el prompt
jobs # [1]+ Ejecutando tail -f /var/log/veloz/app.log &
fg %1 # lo recuperas para poder pararlo con Ctrl-CLa distinción esencial es que Ctrl-C termina el proceso y Ctrl-Z solo lo pausa: un trabajo suspendido sigue existiendo y consumiendo memoria, y si cierras la terminal sin más puede quedar interrumpido a medias. Las señales, los procesos huérfanos, nohup y la gestión seria de procesos se estudian en 05-02.
- Alias para el día a día de Veloz Envíos
Un alias es un nombre corto para un comando largo. Definidos en ~/.bashrc, quedan disponibles en cada sesión:
# --- Navegación, listados y red de seguridad (lección 02-01) ---
alias ll='ls -lh --color=auto'
alias la='ls -lha --color=auto'
alias ..='cd ..'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# --- Veloz Envíos ---
alias vlogs='cd /var/log/veloz'
alias vdatos='cd /srv/veloz/datos'
alias vops='cd ~/veloz-ops'
alias applog='tail -f /var/log/veloz/app.log'
alias errores='grep -c ERROR /var/log/veloz/app.log'
alias ciudades='cut -d, -f3 /srv/veloz/datos/envios.csv | tail -n +2 | sort | uniq -c | sort -rn'Después de editar ~/.bashrc, recuerda recargarlo con source ~/.bashrc (01-02). Comprueba qué hay detrás de un alias con type ciudades, y ejecuta la versión original anteponiendo una barra invertida: \rm fichero ignora el alias rm -i.
Dos límites que conviene conocer desde ya: los alias no aceptan argumentos en medio (para eso están las funciones, en 04-02) y no existen dentro de los scripts, que es exactamente el motivo por el que el siguiente módulo empieza donde empieza. Un alias es un atajo personal; un script es una herramienta que se puede compartir, versionar y programar.
Errores Comunes y Consejos
- Repetir a mano un comando largo. Si lo escribiste alguna vez, está en el historial:
Ctrl-Ry tres letras. - Dejar credenciales en
~/.bash_history. Usa el espacio inicial conignorespace, borra la entrada conhistory -dy, mejor, guarda los secretos en un fichero con permisos600. - Perder el historial al cerrar varias terminales. Añade
shopt -s histappendyPROMPT_COMMAND='history -a'. - Que
Ctrl-Scongele la terminal. Es el control de flujo;Ctrl-Qlo libera ystty -ixonlo desactiva de forma permanente. - Usar
!!sin mirar. Con comandos destructivos, verifica primero con!!:p. - Confundir
Ctrl-CconCtrl-Z. El primero termina, el segundo suspende; los trabajos suspendidos siguen ahí. - Depender de alias defensivos como
rm -i. No existen en scripts ni en otras máquinas. Son una comodidad, no una política de seguridad.
Ejercicios
Ejercicio 1 — Trabajar sin reescribir. Partiendo de ls -l /srv/veloz/datos/historico/2026/08/envios-2026-08-03.csv, consigue con el mínimo de teclas: (a) ver las tres primeras líneas de ese mismo fichero; (b) repetir el ls como root; (c) repetir el ls cambiando 08 por 07 en la primera aparición.
Ejercicio 2 — Un historial profesional. Escribe el bloque que añadirías a ~/.bashrc para que el historial guarde 10000 comandos en memoria y 20000 en fichero, no registre duplicados ni comandos que empiecen por espacio, ignore ls, cd, pwd y history, muestre fecha y hora, y no se pierda al trabajar con varias terminales. Explica cada línea.
Ejercicio 3 — Diagnóstico veloz. veloz-api va lento y quieres, en la misma terminal, vigilar el log en vivo y a la vez consultar cuántas incidencias hay en el CSV. Describe la secuencia de teclas y comandos, y explica por qué Ctrl-Z es preferible a Ctrl-C en este escenario.
Soluciones
Solución al Ejercicio 1
head -3 !$ # (a) !$ inserta el último argumento del comando anterior
sudo !! # (b) !! inserta el comando anterior completo
^08^07 # (c) repite el anterior cambiando la PRIMERA aparición de 08Ojo con (c): ^08^07 sustituye solo la primera coincidencia. En la ruta .../2026/08/envios-2026-08-03.csv la primera aparición de 08 es el directorio, así que el resultado sería .../2026/07/envios-2026-08-03.csv, que probablemente no existe. Para cambiar todas las apariciones hace falta el modificador global: !!:gs/08/07/. Es un buen recordatorio de que las expansiones del historial son literales y conviene verificarlas con :p antes de ejecutar algo importante.
Solución al Ejercicio 2
HISTSIZE=10000 # comandos en memoria durante la sesión
HISTFILESIZE=20000 # comandos conservados en ~/.bash_history
HISTCONTROL=ignoreboth # ignoredups + ignorespace
HISTIGNORE="ls:ll:cd:pwd:history:exit" # ruido que no aporta nada al historial
HISTTIMEFORMAT="%F %T " # fecha y hora en cada entrada de history
shopt -s histappend # añadir al fichero, no sobrescribirlo
PROMPT_COMMAND='history -a' # volcar tras cada comando, no al cerrarignoreboth es la pieza doble: ignoredups evita que veinte ls seguidos llenen el historial, e ignorespace habilita el truco del espacio inicial para comandos con credenciales. histappend y PROMPT_COMMAND van juntos y resuelven el problema clásico de las sesiones simultáneas: sin ellos, la última terminal en cerrarse sobrescribe el fichero con su historial y borra el de las demás.
Solución al Ejercicio 3
tail -f /var/log/veloz/app.log # 1. vigilar el log en vivo
# Ctrl-Z → suspende y devuelve el prompt
bg %1 # 2. reanudarlo en segundo plano
grep -c ',incidencia,' /srv/veloz/datos/envios.csv # 3. consultar mientras sigue
jobs # 4. comprobar el estado del trabajo
fg %1 # 5. recuperarlo y pararlo con Ctrl-C cuando toquePor qué Ctrl-Z y no Ctrl-C: Ctrl-C mataría el tail -f, y con él perderías la continuidad de la vigilancia; las líneas escritas mientras no estabas mirando no aparecerían al relanzarlo, porque tail -f arranca desde el final actual del fichero. Ctrl-Z seguido de bg mantiene el proceso vivo y siguiendo el log sin interrupciones, mientras recuperas el prompt para lanzar la consulta. El único inconveniente es que en segundo plano sus líneas se mezclan con tu sesión; en la práctica, para vigilancias largas se prefiere una segunda terminal o tmux, y para procesos que deban sobrevivir al cierre de la sesión, nohup (05-02).
Conclusión
Con esta lección cierras el Módulo 2 y, con él, tu competencia en la línea de comandos. Sabes reutilizar el historial con !!, !$ y ^viejo^nuevo, y sobre todo buscarlo con Ctrl-R, el atajo que más tiempo te ahorrará en toda tu carrera. Tienes un historial configurado como el de un profesional: amplio, fechado, sin ruido, sin duplicados, a salvo de las sesiones simultáneas y —lo más importante— sin credenciales. Editas la línea con readline en lugar de con las flechas, aprovechas el autocompletado como verificación además de como atajo, distingues suspender de terminar un proceso, y tienes alias que convierten las consultas más repetidas sobre Veloz Envíos en una sola palabra.
Haz balance del módulo completo: creas y organizas ficheros con criterio; interrogas app.log, acceso.log y envios.csv con grep, cut, sort y uniq; entiendes y ajustas permisos; compones filtros con redirecciones y tuberías que ya escriben informes en ~/veloz-ops/logs; seleccionas ficheros con comodines sin miedo; y te mueves rápido. Todo lo que necesitabas de la terminal está aquí.
Y precisamente por eso llega el límite. Un alias no acepta argumentos, una tubería de cinco filtros no se puede documentar ni versionar, y nada de lo que has escrito hoy se ejecutará mañana a las siete de la mañana sin ti delante. En el Módulo 3 damos el salto: guardarás esas líneas en un fichero, aprenderás a ejecutarlo, a darle variables, condiciones y argumentos, y esa cadena que hoy tecleas cada mañana se convertirá en el primer comando de verdad de ~/veloz-ops/bin. Empieza el scripting.
Curso de Programación en Bash
Módulo 1: Introducción a Bash
- ¿Qué es Bash?
- Configurando tu Entorno
- Navegación Básica en la Línea de Comandos
- Entendiendo el Shell
- Encontrar Ayuda: man, help y --help
Módulo 2: Comandos Básicos de Bash
- Operaciones con Archivos y Directorios
- Comandos de Procesamiento de Texto
- Permisos y Propiedad de Archivos
- Redirección y Tuberías
- Comodines y Expansión de Rutas
- Historial y Atajos de Teclado
Módulo 3: Fundamentos de Scripting
- Creando y Ejecutando un Script
- Variables y Constantes
- Operadores Básicos
- Sentencias Condicionales
- Argumentos y Entrada del Usuario
- Comillas, Expansión y Sustitución
Módulo 4: Scripting Intermedio
- Bucles en Bash
- Funciones en Bash
- Arrays y Arrays Asociativos
- Manipulación de Cadenas
- La Sentencia case y los Menús Interactivos
- Aritmética y Cálculos Numéricos
Módulo 5: Técnicas Avanzadas de Scripting
- Operaciones Avanzadas con Archivos
- Gestión de Procesos
- Manejo de Errores y Depuración
- Expresiones Regulares
- Entrada/Salida Avanzada: Descriptores y Here-Documents
- Scripts Modulares y Librerías Reutilizables
Módulo 6: Trabajando con Herramientas Externas
Módulo 7: Automatización y Programación
- Trabajos Cron
- Automatizando Tareas
- Scripts de Respaldo y Restauración
- Monitoreo y Registro
- Servicios y Temporizadores con systemd
- Automatización Remota con SSH
Módulo 8: Mejores Prácticas y Optimización
- Escribiendo Código Legible
- Optimizando Scripts en Bash
- Consideraciones de Seguridad
- Control de Versiones con Git
- Análisis Estático con ShellCheck y shfmt
- Pruebas Automatizadas con Bats
- Portabilidad: POSIX sh frente a Bashismos
