Guias

Terminal productividad: 15 atajos de bash que te ahorran horas

Terminal productividad: 15 atajos de bash que te ahorran horas

Si usas terminal todos los días, estos 15 atajos van a cambiar tu forma de trabajar. Son los que más uso y los que más tiempo ahorran.

—

El atajo de teclado correcto en bash es la diferencia entre terminar una operación en 5 minutos y en 30 segundos. Llevo 15 años usando bash como shell principal y todavía aprendo atajos nuevos cada tanto. Esta guía documenta los 15 atajos que más uso: shortcuts de edición (Ctrl-A/E, Ctrl-W, Alt-B/F), history expansion (!!, !$ , ^old^new), reverse search (Ctrl-R), y los menos conocidos que son oro puro (Alt-., Ctrl-X Ctrl-E, fc). No es una lista exhaustiva — es la lista que realmente uso todos los días.

Si usas bash profesionalmente, esta guía te hace el día más llevadero.

TL;DR — Lo que vas a tener al final

  • Tiempo de lectura: 10-15 minutos, práctica diaria recomendada.
  • Requisitos: bash 4+ (default en cualquier distro moderna).
  • Resultado: 15 atajos internalizados que ahorran minutos por día.
  • Troubleshooting típico: atajos que no funcionan en tmux/screen, diferencias entre readline y vi mode. Solución: `set -o emacs` + tmux config.

1. Ctrl+R — Búsqueda inversa en el historial

Busca comandos que ya escribiste, en tiempo real:

Este snippet muestra el indicador reverse-i-search que aparece al pulsar Ctrl+R y cómo se rellena con el primer match parcial del historial. Es el atajo más alto impacto: una vez que te acostumbrás, dejás de reescribir comandos largos.


# Ctrl+R, luego escribes parte del comando
(reverse-i-search)`ssh ': ssh [email protected]

Troubleshooting: Si el historial está vacío o no aparece nada, revisa HISTSIZE y que las sesiones anteriores lo hayan escrito a ~/.bash_history; además, algunos espacios y comillas alteran los resultados. verifica que Ctrl+R esté libre en tu emulador (PuTTY y tmux lo reasignan a veces) y prueba con una palabra común del historial.

Presiona Ctrl+R otra vez para ver matches anteriores. Esto es el atajo más útil que existe.

—

2. !! — Repetir el último comando

Este ejemplo muestra el flujo de nano sin permisos y cómo !! invoca al último comando elevándolo con sudo mediante la expansión de historial. Es ideal para ese patrón repetido de “escribí un comando que toca /etc y tengo que volver a tipearlo”.


# Escribiste un comando sin sudo
nano /etc/hosts
# Repite con sudo
sudo !!

Troubleshooting: Si sudo !! se queja de TTY, corré el comando en un shell interactivo o agregá -S a sudo; en distribuciones muy restrictivas, !! puede no expandirse si el historial está en una sesión que no escribió. verifica que la elevación se haya hecho efectiva: el segundo comando debería ser el mismo pero con sudo y, si no, nada cambió en el sistema.

—

3. !$ — Último argumento del comando anterior

Este ejemplo ilustra la diferencia entre cd a un directorio recién creado y el uso de !$ para tomar el último argumento sin reescribirlo. Es el atajo complementario a !!: ahorra tipeo cuando la ruta es lo único que cambia entre dos comandos.


mkdir /var/log/myapp
cd !$  # cd /var/log/myapp

Troubleshooting: Si !$ se expande a algo que no esperabas, revisa el comando previo y los espacios finales: una asignación de variable u otro comando puede haber movido el último argumento. verifica con Esc + . antes de Enter si tu emulador lo soporta y confirmá que la expansión coincide con la ruta original.

—

4. !* — Todos los argumentos del comando anterior

Este ejemplo crea varios archivos en una sola línea aprovechando que !* toma todos los argumentos del comando previo. Sirve cuando acabás de mover o listar varios archivos y quieres aplicarles otra operación sin reescribirlos.


cp archivo1.txt archivo2.txt /tmp/
ls !*  # ls archivo1.txt archivo2.txt

Troubleshooting: Si ! no se expande como pensás, comprobá que el comando anterior haya sido el que dejó los argumentos en el historial y que la sintaxis no haya sido un alias que reescribe argv. verifica primero el resultado con echo ! antes de encadenar a un comando destructivo como rm.

—

5. !comando:N — Comando número N del historial

Este ejemplo toma el comando número 42 del historial y lo ejecuta sin reescribirlo. !N es ideal cuando ya identificaste el número de la línea correcta, ya sea por history o por el indicador del propio shell.


!42  # ejecuta el comando #42 del historial

Troubleshooting: Si el índice apunta a un comando que no existe o contiene un patrón que ya no funciona, la ejecución repetirá el error original; siempre conviene mirar history antes de usar un índice desconocido. verifica el contenido con !42:p (print sin ejecutar) cuando el comando sea potencialmente destructivo, sobre todo si tiene rm o redirecciones.

Ver el historial:

Este bloque muestra el history con números de comando, lo que sirve para identificar la línea que quieres invocar luego con !N. Sin esa numeración, los atajos por índice son difíciles de usar.


history | head
# 1  ls
# 2  cd /tmp
# 3  nano /etc/hosts
# ...

Troubleshooting: Si no aparecen timestamps, configura HISTTIMEFORMAT y recargá la sesión; si los duplicados dominan la salida, ajustá HISTCONTROL a ignoredups o erasedups. verifica que la cantidad mostrada coincida con HISTSIZE y que el archivo se esté escribiendo tras salir de la sesión.

—

6. !$ vs Alt+. — Último argumento

Alt+. (Alt + punto) inserta el último argumento del comando anterior. Presiona varias veces para navegar el historial.

Aquí se ve Alt+. (o Esc+.) insertando el último argumento de ls directamente en el comando siguiente. Es equivalente a !$ pero sin pasar por la expansión del historial, lo que ayuda cuando el último argumento es una ruta que no quieres que quede registrada.


ls /var/log/nginx/
cat Alt+.  # cat /var/log/nginx/

Troubleshooting: Si Alt+. no funciona, revisa que tu emulador o multiplexor (tmux, screen) no esté reasignando la combinación; algunos terminales usan Esc como prefijo. verifica que la ruta insertada sea la que esperas antes de ejecutar, especialmente con comandos como rm o redirecciones a /etc.

—

7. Ctrl+A / Ctrl+E — Inicio/fin de línea

  • Ctrl+A: ir al inicio
  • Ctrl+E: ir al final

Mucho más rápido que moverte con flechas.

—

8. Ctrl+U / Ctrl+K — Borrar hasta inicio/fin

  • Ctrl+U: borrar desde el cursor hasta el inicio
  • Ctrl+K: borrar desde el cursor hasta el final

—

9. Ctrl+W — Borrar palabra

Borra la palabra anterior al cursor.

—

10. Ctrl+Left / Ctrl+Right — Saltar palabras

Salta palabra por palabra en la línea de comandos.

—

11. !?texto? — Buscar y ejecutar

Busca el último comando que contenga “texto” y lo ejecuta:

Este ejemplo ilustra !?ssh?, que busca y ejecuta el último comando que contenga la cadena indicada. A diferencia de !ssh, !?cadena? no requiere coincidencia por prefijo, lo que la hace más laxa y peligrosa si hay varios matches sensibles.


!?ssh  # ejecuta el último comando con "ssh"

Troubleshooting: Si ejecuta algo que no esperabas, la coincidencia con la cadena es demasiado laxa; revisa con !?cadena?:p antes para imprimir sin ejecutar. verifica que el match corresponda al comando que tú quieres: con ? rodeando la cadena, se permite cualquier substring y el resultado puede no ser lo que recordás.

—

12. ^texto1^texto2 — Reemplazar y ejecutar

Reemplaza texto1 por texto2 en el último comando y ejecuta:

Este ejemplo muestra el típico error de tipeo y cómo ^mal^ok^ lo corrige y vuelve a ejecutar el comando en un solo paso. Es el atajo más directo cuando te diste cuenta del error recién después de apretar Enter.


nano /etc/hosst
^hosst^hosts^  # ejecuta: nano /etc/hosts

Troubleshooting: Si ejecuta un comando que no es el correcto, la cadena original era ambigua o había varias apariciones; el modificador sustituye solo la primera, no todas. verifica primero con ^mal^ok^:p para ver cómo quedaría sin correrlo, sobre todo si el original era un rm o un mv.

—

13. {} expansión de braces

Genera combinaciones automáticamente:

Esta expansión de braces genera un árbol de directorios y dos conjuntos de archivos en una sola línea, mostrando la potencia de {} para crear variantes. Es ideal para inicializar proyectos con estructura repetida.


mkdir proyecto/{src,docs,tests}
# Crea: proyecto/src, proyecto/docs, proyecto/tests
touch app.{js,ts,jsx,tsx}
# Crea: app.js, app.ts, app.jsx, app.tsx
echo {a,b,c}{1,2,3}
# Imprime: a1 a2 a3 b1 b2 b3 c1 c2 c3

Troubleshooting: Si las llaves no se expanden como esperas, el shell puede estar en modo sh o dash; corrélo en bash o zsh y verifica que la sintaxis tenga comas y no espacios. verifica el árbol con tree o ls después; si no aparecen las variantes, un alias puede estar reescribiendo mkdir o touch.

—

14. !! con sudo (alias)

Crea un alias en tu ~/.bashrc:

Este alias please envuelve el último comando con sudo y le pasa el comando anterior vía fc. Dejándolo en ~/.bashrc te ahorra el sudo !! y queda disponible en cualquier sesión nueva.


alias please='sudo $(fc -ln -1)'

Troubleshooting: Si el alias no aplica, recuerda que los aliases no se expanden en shells no interactivos; en scripts usa una función o sudo directamente. verifica con type please que apunte al alias correcto y prueba con un comando benigno antes de darle permisos a algo destructivo.

Ahora:

Este ejemplo vuelve a invocar nano /etc/hosts pero ahora mediante el alias please, que le agrega sudo. Es el caso típico donde el atajo paga: reescribir el path ya lo hiciste, solo falta el permiso.


nano /etc/hosts
please  # ejecuta sudo nano /etc/hosts

Troubleshooting: Si please no agrega sudo, revisa que el alias se haya cargado (source ~/.bashrc) y que fc -ln -1 devuelva el comando esperado. verifica en una terminal nueva que el alias se haya expandido y que el comando elevado tenga efecto; sin eso, la edición falla por permisos.

—

15. set -o vi en bashrc

Edita la línea de comandos con shortcuts de Vi:

Estas dos líneas activan el modo edición Vi en la línea de comandos y recargan el .bashrc para que el cambio esté disponible sin reiniciar la sesión. Pasaje a modo Vi es un salto grande en velocidad para quienes ya conocen los atajos de vim.


echo 'set -o vi' >> ~/.bashrc
source ~/.bashrc

Troubleshooting: Si el modo Vi no responde como esperas, asegurate de ejecutar set -o vi en ~/.bashrc (no en /etc/profile) y de abrir un shell nuevo; también, vi o vim no son requisitos. verifica que b, w, dw y 0 funcionen en la línea de comandos; si no, tu readline puede estar en otro modo.

Ahora puedes usar b (atrás), w (palabra), dw (borrar palabra), etc.

—

Bonus: $? — Exit code del último comando

Este ejemplo muestra cómo consultar el exit code de un comando para tomar decisiones: 0 es éxito y un valor distinto, un fallo. Es la base de cualquier if en scripts y de la lógica de &&/|| en la línea de comandos.


ls /tmp/
echo $?  # imprime 0 (éxito)
ls /no/existe
echo $?  # imprime 2 (error)

Troubleshooting: Si $? parece no cambiar, recuerda que guarda el código del comando inmediatamente anterior y se sobrescribe con cada nuevo comando. verifica corriendo el comando y luego echo $? en la misma línea con && para no perder el valor por otro comando intermedio.

Útil en scripts para saber si un comando falló.

—

Bonus 2: tee — comando + log

Ejecuta un comando y guarda el output simultáneamente:

Este ejemplo usa tee para mostrar el output en pantalla y a la vez dejarlo en output.log, útil para monitorear y dejar registro a la vez. Es una de las formas más limpias de “ver y guardar” sin redirigir a un archivo y abrir otra terminal.


./mi-script.sh | tee output.log
# El output se muestra en pantalla Y se guarda en output.log

Troubleshooting: Si no se crea el archivo, revisa la ruta y los permisos del directorio; si el proceso no produce output, tee crea el archivo vacío pero no necesariamente el contenido. verifica que el archivo tenga tamaño y que el tail -f muestre nuevas líneas; eso confirma que el comando realmente emite datos.

—

Bonus 3: !! con confirm

Para evitar ejecutar el último comando sin querer:

Este comando activa histverify, que hace que !! y los !N pidan confirmación antes de ejecutarse. Es un seguro barato cuando recién empezás a usar expansión de historial y no quieres ejecutar un comando destructivo por accidente.


shopt -s histverify
# Ahora !! pide confirmación antes de ejecutar

Troubleshooting: Si la confirmación no aparece, recuerda que solo afecta a la expansión de historial, no a otros atajos; además, set -o no es persistente a menos que lo pongas en el .bashrc. verifica que después de shopt -s histverify, !! ofrezca editar la línea antes de correrla; si no lo hace, tu bash puede ser una versión que no soporta la opción.

—

Bonus 4: expandir historial en línea

Escribís !ssh y, antes de presionar Enter, usas Ctrl+Alt+E (shell-expand-line en readline) para que bash expanda la línea en el buffer. Revisás o editas el resultado y recién ahí presionás Enter.

Mac Terminal: dentro de un comando interactivo puedes escribir ! literal cerrando comillas y abriendo de nuevo (echo '!'date) o desactivando la expansión temporalmente con set +H. El backslash ! solo funciona en scripts con bash -c, no en interactive shells.

—

Bonus 5: definir tu propio atajo

Este .bashrc de ejemplo define aliases útiles para producción: up, ll, gs, gp, hosts, myip y ports. Tenerlo versionado y aplicar source te da un shell consistente entre sesiones y entre equipos.


# .bashrc
alias up='cd ..'
alias ll='ls -lah'
alias gs='git status'
alias gp='git pull'
alias hosts='sudo nano /etc/hosts'
alias myip='curl -s ifconfig.me'
alias ports='netstat -tulanp'

Troubleshooting: Si un alias no se aplica, corrélo en una shell nueva tras source ~/.bashrc; aliases no se heredan en scripts no interactivos, convertilos en funciones si necesitas usarlos allí. verifica que myip y ports funcionen en tu distro: ifconfig.me puede requerir curl instalado y netstat puede estar reemplazado por ss.

—

Setup final recomendado en .bashrc

Este bloque final sube el HISTSIZE, activa vi mode, exporta colores, define aliases y agrega una función para el branch de Git en el prompt. Cargalo en ~/.bashrc y va a aplicar a toda nueva sesión, mejor que tocar cada ajuste a mano.


# Historial
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTCONTROL=ignoredups:erasedups
export HISTTIMEFORMAT="%F %T "
# Vi mode
set -o vi
# Color
export CLICOLOR=1
export LSCOLORS=ExFxBxDxCxegedabagacad
# Aliases
alias ll='ls -lah'
alias la='ls -A'
alias l='ls -CF'
alias up='cd ..'
alias grep='grep --color=auto'
alias ports='netstat -tulanp'
# Prompt con git branch
parse_git_branch() {
  git branch 2>/dev/null | grep '*' | sed 's/* //'
}
export export PS1='u@h:w$(parse_git_branch) $ '

Troubleshooting: Si parse_git_branch no se invoca, asegurate de que git esté instalado y que la función esté exportada al PS1 con $(...) para que se evalúe cada vez. verifica que la rama aparezca en el prompt; si muestra un ( literal, el PS1 no interpretó la expansión o las comillas simples lo rompieron.

Nota: LSCOLORS es sintaxis BSD/macOS. En Linux se usa LS_COLORS con sintaxis distinta — configura con dircolors o exportá LS_COLORS='di=1;34:fi=0:ln=1;36' para colores básicos (directorios azul, enlaces cian). Si ves LSCOLORS=ExFx... en una distro Linux, es copy-paste de tutorial macOS — no funciona.

—

Resumen

Estos 15 atajos cambian la productividad en terminal. Empieza con estos 5:

1. Ctrl+R (búsqueda inversa)

2. !! (repetir último)

3. !$ (último argumento)

4. Ctrl+A / Ctrl+E (inicio/fin)

5. Ctrl+U / Ctrl+K (borrar hasta inicio/fin)

Los otros 10 los agregas gradualmente.

Tiempo ahorrado: 30-60 minutos por día una vez que los domines.

Lee también: Vim para principiantes si quieres llevar la productividad al siguiente nivel con un editor de texto, o Ansible desde cero para automatizar tareas de servidor.


Preguntas frecuentes

¿Por qué Terminal productividad: 15 atajos de bash que te ahorran horas es relevante para sysadmins Linux?

Forma parte del flujo diario de administración. Los conceptos explicados se aplican directamente a servidores en producción y resuelven problemas reales que enfrentan sysadmins hispanohablantes.

¿Qué necesito para empezar con Terminal productividad: 15 atajos de?

Distribución Linux actualizada (Debian, Ubuntu, RHEL, Fedora o Arch), acceso root, y conexión a internet. Para producción: entorno de staging separado antes de aplicar cambios.

¿Cuáles son los errores más comunes con Terminal productividad: 15 atajos de?

Los tres más frecuentes: (1) saltar la lectura de logs, (2) aplicar cambios directos en producción sin probar, (3) olvidar permisos y ownership. La documentación y un plan de rollback siempre.

¿Cuándo usar Terminal productividad: 15 atajos de y cuándo una alternativa?

Esta solución es ideal para el caso descrito. Alternativas como Docker, Ansible o configuración manual pueden ser mejores según contexto: portabilidad, escala y reproducibilidad son los factores clave.

¿Cómo migro desde una configuración previa a Terminal productividad: 15 atajos de?

Documentar el estado actual, probar la nueva configuración en staging, validar funcionalmente, y aplicar en producción con rollback plan listo. Los posts de SoyLinux incluyen troubleshooting para los problemas más comunes.

Lee también

Alfonso Moreno | Sysadmin Senior

Soy Alfonso, sysadmin senior con RHCE y más de 10 años administrando sistemas Linux para empresas y proyectos personales. Me especializo en infraestructura, redes, virtualización, monitoring, automation y self-hosting. Sobre SoyLinux.com SoyLinux.com es un blog técnico en español sobre Linux, software libre y self-hosting. Lo mantengo en mi tiempo libre. Áreas de expertise - Linux server administration: RHEL, CentOS, Rocky, Alma, Fedora, Debian, Ubuntu - Network services: Postfix, BIND, Samba, NFS, Squid - Virtualización y containers: KVM, Proxmox, Docker, Podman - Monitoring: Prometheus, Grafana, Zabbix - Automation: Ansible, Bash scripting - Self-hosting: Vaultwarden, Nextcloud, Jellyfin, Immich, Homelab Contacto - Email: [email protected]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *