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

  1. El historial de comandos y history
  2. Expansión del historial: !!, !$ y compañía
  3. Búsqueda incremental con Ctrl-R
  4. Configurar el historial: HISTSIZE, HISTCONTROL y amigos
  5. No dejes contraseñas en el historial
  6. Edición de línea con readline
  7. Autocompletado con Tab
  8. Control de trabajos: primer contacto
  9. Alias para el día a día de Veloz Envíos

  1. El historial de comandos y history

Bash guarda cada comando que ejecutas en una lista numerada, que al cerrar la sesión vuelca en ~/.bash_history.

history | tail -3
  514  chmod 600 ~/veloz-ops/etc/veloz-ops.conf
  515  ls -l ~/veloz-ops/bin/
  516  history | tail -3

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.

  1. Expansión del historial: !!, !$ y compañía

Bash 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-api

Y !$ 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.csv

Existe además la sustitución rápida ^viejo^nuevo, que repite el comando anterior cambiando la primera aparición de una cadena:

grep ERROR /var/log/veloz/app.log
^ERROR^WARN     # ejecuta: grep WARN /var/log/veloz/app.log

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.

  1. Búsqueda incremental con Ctrl-R

La 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.

(reverse-i-search)`incid': grep ',incidencia,' /srv/veloz/datos/envios.csv | cut -d, -f3
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.

  1. Configurar el historial: HISTSIZE, HISTCONTROL y amigos

El 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:

export HISTTIMEFORMAT="%F %T  "
history 2
  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 cerrar

Con 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.

  1. 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-03

Fí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.

  1. 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-Y funcionan como cortar y pegar: borras una ruta larga, escribes otra cosa y la recuperas donde quieras.
  • Ctrl-U es 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-E es la salida de emergencia cuando la tubería que estás componiendo ya no cabe en una línea: se abre en vim o nano, la editas con comodidad y al guardar y salir, Bash la ejecuta.

  1. 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.

cd /srv/vel<Tab>              → cd /srv/veloz/
cat /var/log/veloz/ac<Tab>    → cat /var/log/veloz/acceso.log

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.

sudo apt install bash-completion    # en Ubuntu 24.04 suele venir ya instalado

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.

  1. 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-C

La 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.

  1. 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-R y tres letras.
  • Dejar credenciales en ~/.bash_history. Usa el espacio inicial con ignorespace, borra la entrada con history -d y, mejor, guarda los secretos en un fichero con permisos 600.
  • Perder el historial al cerrar varias terminales. Añade shopt -s histappend y PROMPT_COMMAND='history -a'.
  • Que Ctrl-S congele la terminal. Es el control de flujo; Ctrl-Q lo libera y stty -ixon lo desactiva de forma permanente.
  • Usar !! sin mirar. Con comandos destructivos, verifica primero con !!:p.
  • Confundir Ctrl-C con Ctrl-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 08

Ojo 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 cerrar

ignoreboth 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 toque

Por 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

Módulo 2: Comandos Básicos de Bash

Módulo 3: Fundamentos de Scripting

Módulo 4: Scripting Intermedio

Módulo 5: Técnicas Avanzadas de Scripting

Módulo 6: Trabajando con Herramientas Externas

Módulo 7: Automatización y Programación

Módulo 8: Mejores Prácticas y Optimización

Módulo 9: Proyectos del Mundo Real

© Copyright 2026. Todos los derechos reservados