- Un resumen de cómo aprovechar diversos atajos de teclado y combinaciones de comandos para mejorar la velocidad y la eficiencia al trabajar en el entorno del shell
- Con atajos básicos como CTRL + W, U, K, Y se puede editar la línea, con CTRL + A/E, ALT + B/F mover el cursor, y con reset recuperar la terminal
- En Bash y Zsh, CTRL + R permite buscar en el historial de comandos, !!·!$·ESC+. reutilizar comandos anteriores, y Brace Expansion junto con Globstar automatizan tareas repetitivas
- Funciones avanzadas como Process Substitution, tee y bg/disown mejoran la eficiencia del control de procesos y la gestión de logs
- Si dominas el shell como si fuera una caja de herramientas, puedes aumentar tu productividad y concentración; la clave es convertir los atajos en hábitos, uno por uno
Atajos y funciones básicas que funcionan en casi cualquier shell
-
La combinación CTRL + W, U, K, Y** es un atajo de edición de línea que permite borrar o restaurar rápidamente palabras o partes de la línea tomando como referencia la posición del cursor**
CTRL + W borra la palabra anterior al cursor
CTRL + U corta desde el cursor hasta el inicio de la línea, y se puede pegar de nuevo con CTRL + Y
CTRL + K corta desde el cursor hasta el final de la línea
- CTRL + A / E mueve al inicio y al final de la línea, y ALT + B / F se desplaza una palabra hacia atrás o hacia adelante
- En la mayoría de terminales vienen activados por defecto; en Mac, la tecla Option debe configurarse como Meta para que funcionen
- Los comandos reset o stty sane permiten recuperar la terminal cuando se rompe por haber mostrado por error un archivo binario
- Aunque la pantalla se vea corrupta, aún se puede escribir; basta con teclear
reset y presionar Enter para restaurarla
- CTRL + C / D envía la señal de interrupción del comando y la señal EOF (fin de archivo), respectivamente
- Si se pulsa
CTRL + D en un prompt vacío, se cierra el shell
- CTRL + L limpia la pantalla de inmediato, igual que el comando
clear
- Mantiene el comando que estás escribiendo y mueve el prompt a la parte superior de la pantalla
- cd - vuelve de inmediato al directorio anterior, y pushd / popd permite moverse entre varias ubicaciones usando una pila de directorios
- > file.txt vacía un archivo sin borrarlo, por lo que conserva permisos y propietario
- La variable $_ reutiliza el último argumento del comando anterior
- Ejemplo:
mkdir -p /path/newdir && cd "$_"
- set -e y set -u son opciones que aumentan la seguridad de los scripts
set -e hace que el script termine de inmediato si ocurre un error
set -u trata como error las referencias a variables no definidas
- La combinación
set -euo pipefail ofrece una protección más robusta
Atajos y funciones avanzadas en Bash y Zsh
- CTRL + R realiza una búsqueda incremental inversa en el historial de comandos
- Al escribir una palabra clave, puedes encontrar y reutilizar de inmediato comandos anteriores
- !! vuelve a ejecutar el comando completo anterior
- Con
sudo !! puedes relanzar el último comando con privilegios de administrador
- CTRL + X, CTRL + E abre el comando que estás escribiendo en el editor predeterminado (Vim, Nano, etc.) para modificarlo y luego ejecutarlo
- En Zsh se requiere configuración adicional
- El comando fc es la forma tradicional de abrir un comando anterior en
$EDITOR para editarlo
- ESC + . o ALT + . inserta en la posición del cursor el último argumento del comando anterior
- Si lo repites, va recorriendo también argumentos de comandos aún más antiguos
- !$ hace lo mismo en forma no interactiva
-
Brace Expansion** es una función de expansión con llaves que reduce la escritura repetitiva**
cp pf.conf{,.bak} → cp pf.conf pf.conf.bak
mv filename.{txt,md} → mv filename.txt filename.md
mkdir -p project/{src,tests,docs} crea varios directorios
- Process Substitution
<(command) trata la salida de un comando como si fuera un archivo
- Ejemplo:
diff <(sort file1.txt) <(sort file2.txt) permite comparar sin archivos temporales
- Globstar(
**) busca archivos de forma recursiva en subdirectorios
- En Bash se activa con
shopt -s globstar, y en Zsh viene activado por defecto
- Ejemplo:
ls **/*.js busca archivos JS en todas las subcarpetas
-
La combinación CTRL + Z**,** bg**,** disown** permite** ejecutar procesos en segundo plano y separarlos del shell
CTRL + Z para suspender → bg para enviar a segundo plano → disown para separarlo del shell
- Así el proceso puede seguir corriendo incluso después de cerrar una sesión SSH
- command |& tee file.log envía por el pipe tanto la salida estándar (stdout) como el error estándar (stderr)
|& es la forma abreviada de 2>&1 |
- Con
tee puedes ver la salida en pantalla y guardarla al mismo tiempo en un log
Consejos clave para aprovechar el shell
- El shell es una caja de herramientas y, si lo manejas con soltura, puede aumentar mucho tu productividad
- En vez de aprender todos los atajos de una sola vez, es más efectivo convertirlos en hábito uno por uno
- Reducir la escritura repetitiva y el tecleo innecesario ayuda a simplificar el flujo de trabajo
- Una vez que te acostumbras, la terminal deja de ser un obstáculo y se convierte en tu propio espacio de trabajo
3 comentarios
Casi todo son combinaciones de teclas de emacs, pero casi ni se menciona a Emacs; ver que últimamente se comparten mucho como si fueran simples tips me hace sentir el paso del tiempo. La biblioteca readline implementó básicamente todas esas combinaciones de teclas de Emacs. Siento que ya pasaron casi 20 años desde que casi todo se cambió a los IDE, pero desde la perspectiva de un fósil que todavía usaba cosas como
gdbtui, una vez más pienso que lo bueno no muere.Comentarios de Hacker News
Sentí que me cambió la vida en el momento en que remapeé la tecla de flecha arriba
Ahora, en vez de recorrer todos los comandos, solo busca los comandos que empiezan con el texto que ya escribí
Por ejemplo, si escribo
tar -y luego presiono flecha arriba, me aparecen de inmediato las opciones de tar que usé antesEn zsh se configura así
.inputrc.inputrcActivar vim-mode en la terminal la hace mucho más cómoda
¿Te equivocaste tres palabras atrás? Con
3bcwse arreglaPara borrar toda la línea,
cc; para ediciones complejas, puedes abrirla directamente en (neo)vim convSi ya usas (neo)vim, es ideal porque no necesitas aprender atajos nuevos
ctrl-x+ees un buen punto medioset -o viMe impresionó que alguien metiera un script llamado
\#en el PATH para poder comentar parte de un pipeline~/bin/noglobtengo y así evito conflictos de noglob cuando llamo scripts de zsh desde bashmycmd1 #| mycmd2$PATHCTRL+W normalmente borra hasta el espacio anterior, así que elimina todo
/var/log/nginx/Alt+Backspace borra hasta antes del carácter no alfabético
Ojo, porque puede chocar con el atajo para cerrar pestañas del navegador
/de la configuración$WORDCHARS, obtienes el comportamiento deseado (enlace de referencia)Recomiendo mejorar la búsqueda en el historial con la integración de shell de fzf
Video de demostración / Documentación oficial
Tengo un truco que uso seguido
Cuando estoy escribiendo un comando largo pero antes tengo que hacer otra cosa, no lo cancelo con
Ctrl-C: lo comento y lo ejecuto para que quede en el historial"push-line-or-edit", y en bash se puede lograr algo parecido conC-useguido deC-yctrl-upara guardar y vaciar la línea actual, y luegoctrl-ypara pegarla de nuevo. En zsh,alt-qpuede automatizar este procesoalt-shift-3puedes anteponer#al comando actual y saltar a una línea nuevaEl título con estilo LLM no me gusta mucho, pero algunos consejos sí son útiles y pienso probarlos
Es una pena que brace expansion no se lleve tan bien con el autocompletado con tab. Ojalá hubiera funciones como duplicar el último token o quitar extensiones de archivo
En la configuración de zsh uso una función para excluir ciertos comandos del historial
Por ejemplo, para que comandos peligrosos como
--forceno queden guardados en el historialEn zsh uso un snippet que implementa la expansión automática de aliases globales
Por ejemplo, si configuras
alias -G G='rg -s', cuando escribescommand | Gse expande automáticamente acommand | rg -sSe expande automáticamente al presionar espacio, y si escribes
\aliasse omite la expansiónTengo una función “deep cd” en
.bashrcSe mueve automáticamente al primer directorio que contiene la cadena pasada como argumento
Al principio pensé que sería lenta, pero terminé usándola más de lo esperado
jcde autojump, z o fzfLo de remapear la flecha hacia arriba de arriba, los usuarios de Emacs simplemente lo hacen con
c-r. El final del tuning es dejarlo stock.