72 puntos por GN⁺ 2026-03-27 | 3 comentarios | Compartir por WhatsApp
  • 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

 
phoon 2026-03-30

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.

 
GN⁺ 2026-03-27
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é antes
    En zsh se configura así

    bindkey "^[OA" up-line-or-beginning-search # Up  
    bindkey "^[OB" down-line-or-beginning-search # Down
    
    • Cuando empiezas a usar CTRL+r, nunca vuelves a usar la flecha arriba
    • Me parece un antes y después total. Para hacer algo parecido en bash, agrega esto a .inputrc
      "\e[A":history-search-backward  
      "\e[B":history-search-forward
      
    • En fish shell este es el comportamiento predeterminado. Puedes recorrer comandos con flecha arriba/abajo según la palabra que escribiste, y también recorrer solo argumentos con alt+arriba/abajo
    • También se puede implementar igual en .inputrc
    • Yo dejo las flechas arriba/abajo como están y en su lugar configuro ctrl+p y ctrl+n de esta manera
  • Activar vim-mode en la terminal la hace mucho más cómoda
    ¿Te equivocaste tres palabras atrás? Con 3bcw se arregla
    Para borrar toda la línea, cc; para ediciones complejas, puedes abrirla directamente en (neo)vim con v
    Si ya usas (neo)vim, es ideal porque no necesitas aprender atajos nuevos

    • Me recuerda a un pasaje antiguo del manual de Emacs. En vez de comandos complejos, me gustaría recomendar configurar bien el mouse
    • Llevo más de 20 años usando (n)vim, pero no me gusta el vi-mode del shell. Cuando necesito algo complejo, abrirlo en neovim con ctrl-x+e es un buen punto medio
    • Yo también uso vim seguido, pero no en el shell. En su lugar uso atajos estilo Emacs (ctrl-a, ctrl-e, etc.) en todo macOS. Ojalá vim soportara bindings de emacs en modo insert
    • Recién me entero de que la función se llama “readline vi-mode”. Voy a investigar más
    • No entiendo por qué el modo emacs es el predeterminado. Cada vez que abro un shell nuevo, lo primero que escribo es set -o vi
  • Me impresionó que alguien metiera un script llamado \# en el PATH para poder comentar parte de un pipeline

    #!/bin/sh
    cat
    
    • Yo uso un truco parecido. En ~/bin/noglob tengo
      #!/bin/sh
      $*
      
      y así evito conflictos de noglob cuando llamo scripts de zsh desde bash
    • Yo uso comentarios entre paréntesis. Sirven para documentar scripts, pero en el shell interactivo son incómodos. Aun así, es una forma creativa de comentar y me parece divertida
    • Me pregunto qué ventaja tiene frente a mycmd1 #| mycmd2
    • Esto sí que es útil; lo voy a agregar a mi $PATH
  • CTRL+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

    • Desde Firefox v147 se agregó la posibilidad de redefinir atajos. Enlace relacionado
    • En macOS no existe este problema porque los atajos de GUI y los del terminal están separados. ⌘C, ⌘W, etc. funcionan igual dentro de la terminal
    • En mi entorno (fish + Alacritty) pasa al revés. Aun así, menos mal que Ctrl-Shift-T permite restaurar una pestaña cerrada
    • Si quitas / de la configuración $WORDCHARS, obtienes el comportamiento deseado (enlace de referencia)
    • Con Ctrl-Shift-T puedes restaurar la pestaña al instante
  • 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

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • En zsh se puede hacer con el binding "push-line-or-edit", y en bash se puede lograr algo parecido con C-u seguido de C-y
    • Una forma más fácil es usar ctrl-u para guardar y vaciar la línea actual, y luego ctrl-y para pegarla de nuevo. En zsh, alt-q puede automatizar este proceso
    • En bash, con alt-shift-3 puedes anteponer # al comando actual y saltar a una línea nueva
  • El 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

    • El estilo del texto también se siente como escrito por un LLM. Por ejemplo, frases como “The shell is a toolbox, not an obstacle course.”
    • PowerShell también tiene modo readline, así que cuando lo usas junto con WSL cuesta menos cambiar de uno a otro
    • readline funciona como si fuera parte de bash, así que creo que está bien considerar estos consejos como funciones del shell
  • En la configuración de zsh uso una función para excluir ciertos comandos del historial
    Por ejemplo, para que comandos peligrosos como --force no queden guardados en el historial

    function zshaddhistory() {
      emulate -L zsh
      if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
      else
        return 1
      fi
    }
    
    • Yo hago algo parecido: tengo un alias que agrega un espacio al inicio de los comandos que no quiero registrar
      unhist () { alias $1=" $1"; }
      unhist unhist
      unhist fzf
      unhist rghist
      
  • En zsh uso un snippet que implementa la expansión automática de aliases globales
    Por ejemplo, si configuras alias -G G='rg -s', cuando escribes command | G se expande automáticamente a command | rg -s
    Se expande automáticamente al presionar espacio, y si escribes \alias se omite la expansión

  • Tengo una función “deep cd” en .bashrc
    Se mueve automáticamente al primer directorio que contiene la cadena pasada como argumento

    dcd() {
      [ -z "$1" ] && return
      local dir
      dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null)
      [ -n "$dir" ] && cd "$dir"
    }
    

    Al principio pensé que sería lenta, pero terminé usándola más de lo esperado

    • También vale la pena mirar herramientas de cd inteligente como jc de autojump, z o fzf
 
phoon 2026-03-30

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