Abreviaturas vs Alias en Fish Shell - ¿Cuál es la Diferencia?

Fish Shell tiene abreviaturas y alias. Esta guía explica cómo funciona cada uno, cuándo usar cuál, y por qué las abreviaturas suelen ser la mejor opción.

Abreviaturas vs Alias en Fish Shell - ¿Cuál es la Diferencia?

Si vienes a Fish desde Bash o Zsh, probablemente configuraste alias para los comandos que usas con frecuencia. Fish también tiene alias, pero además tiene algo llamado abreviaturas, y funcionan de una manera diferente que importa.

Yo cambié todos mis alias por abreviaturas después de usar Fish durante una semana, y creo que la mayoría debería hacer lo mismo. Te explico por qué.

¿Qué son los alias en Fish?

Un alias en Fish funciona igual que en otros shells. Defines un atajo que se expande a un comando más largo:

alias gs="git status"
alias ll="ls -la"
alias dc="docker compose"

Cuando escribes gs y presionas enter, Fish ejecuta git status. En tu historial de comandos, guarda gs, no git status.

Fish implementa los alias como funciones envolventes. Cuando ejecutas alias gs="git status", Fish crea una función llamada gs que ejecuta git status. Puedes verificarlo con:

type gs
# Output: gs is a function with definition
# function gs --wraps='git status' --description 'alias gs=git status'
#   git status $argv
# end

Para hacer los alias persistentes, agrégalos a ~/.config/fish/config.fish o a un archivo en ~/.config/fish/conf.d/.

¿Qué son las abreviaturas?

Las abreviaturas se ven similares cuando las defines:

abbr -a gs git status
abbr -a ll ls -la
abbr -a dc docker compose

La diferencia está en lo que pasa cuando las usas. Escribe gs y presiona espacio o enter, y Fish reemplaza gs con git status en la línea de comandos antes de ejecutarlo. Ves el texto completo git status, y eso es lo que queda en tu historial.

Es un sistema de expansión de texto, no un envoltorio de comandos. Tu abreviatura se activa, el texto en la línea de comandos cambia, y luego se ejecuta lo que quedó en la línea.

Por qué las abreviaturas suelen ser mejores

Tu historial se mantiene legible

Con alias, tu historial está lleno de códigos cortos. Alguien que mire gs en tu historial (o tú mismo, seis meses después) tiene que recordar qué significa gs. Con abreviaturas, el historial muestra git status porque eso es lo que realmente se ejecutó.

Esto también significa que la búsqueda en el historial con Ctrl+R funciona con los comandos reales. Busca “git status” y lo encontrarás, aunque hayas escrito gs.

Otras personas pueden leer tu pantalla

Si compartes tu terminal (programación en pareja, grabaciones de pantalla, tutoriales), las abreviaturas muestran los comandos reales. Nadie tiene que descifrar tus atajos personales.

Puedes editar antes de ejecutar

Después de que una abreviatura se expande, el texto completo está en tu línea de comandos y puedes modificarlo. Escribe gs, presiona espacio (se expande a git status), y luego agrega --short al final. Con alias, no puedes insertar flags fácilmente en medio del comando aliasado.

Sin sobrecarga de funciones

Los alias crean funciones envolventes. Las abreviaturas no — son puro reemplazo de texto. La diferencia es mínima en la práctica, pero las abreviaturas son conceptualmente más simples.

Cuándo usar alias en su lugar

Los alias siguen siendo útiles en algunos casos:

Cuando necesitas manipular argumentos del comando. Si tu atajo necesita manipular argumentos de formas que van más allá del reemplazo de texto, una función tiene más sentido:

# Esto necesita ser una función, no una abreviatura
function mkcd
    mkdir -p $argv[1] && cd $argv[1]
end

Cuando necesitas flags por defecto en comandos existentes. Si quieres que ls siempre use --color=auto, un alias funciona:

alias ls="ls --color=auto"

Podrías hacerlo con una abreviatura, pero la expansión sería visible cada vez, lo cual resulta molesto para comandos que ejecutas constantemente.

Cuando quieres un nombre de comando completamente diferente que no necesite mostrar su expansión. Algunas personas prefieren mantener sus atajos opacos.

Funcionalidades de las abreviaturas

Las abreviaturas en Fish se han vuelto más potentes con el tiempo, especialmente en Fish 4.x. Estas son las opciones que vale la pena conocer.

Posición: command vs. anywhere

Por defecto, las abreviaturas solo se expanden cuando están en posición de comando (la primera palabra en la línea):

abbr -a gs git status        # solo se expande como comando
abbr -a -p anywhere L "| less"   # se expande en cualquier parte de la línea

La abreviatura L te permite escribir cat file.txt L y se expande a cat file.txt | less.

Abreviaturas específicas por comando

Desde Fish 4.0, las abreviaturas pueden restringirse a comandos específicos:

abbr -a --command git co checkout
abbr -a --command git br branch
abbr -a --command docker ps "ps --format 'table {{.Names}}\t{{.Status}}'"

Ahora co solo se expande a checkout cuando el comando en la línea es git. Escribe co por sí solo y no pasa nada.

Esto es genial para flujos de trabajo con git. Puedes escribir git co y que se expanda a git checkout sin contaminar el espacio global de abreviaturas.

Abreviaturas con regex

Puedes usar expresiones regulares para definir los disparadores de abreviaturas:

abbr -a --regex '.+\.txt' --position command --function vim_edit

Esto coincidiría con cualquier palabra que termine en .txt y la pasaría a través de una función personalizada. La documentación de Fish tiene más ejemplos de esto.

Posición del cursor con —set-cursor

Puedes controlar dónde queda el cursor después de la expansión:

abbr -a gcm --set-cursor "git commit -m '%'"

Escribe gcm, presiona espacio, y se expande a git commit -m '' con tu cursor entre las comillas. El marcador % (el valor por defecto) se elimina y el cursor aterriza ahí.

Abreviaturas basadas en funciones

Para expansiones dinámicas, puedes apuntar una abreviatura a una función:

function last_history_item
    echo $history[1]
end
abbr -a !! --position anywhere --function last_history_item

Esto recrea la funcionalidad !! de Bash (último comando). Escribe sudo !! y se expande a sudo <tu-último-comando>.

Gestión de abreviaturas

abbr                   # listar todas las abreviaturas (la salida se puede reutilizar como comandos)
abbr --list            # listar solo los nombres de abreviaturas
abbr --erase gs        # eliminar una abreviatura
abbr --rename gs gst   # renombrar una abreviatura

Guardar abreviaturas

La forma recomendada es poner tus comandos abbr -a en un archivo de configuración:

# ~/.config/fish/conf.d/abbreviations.fish
abbr -a gs git status
abbr -a ga git add
abbr -a gc git commit
abbr -a gp git push
abbr -a gd git diff
abbr -a gl git log --oneline
abbr -a dc docker compose
abbr -a dcu docker compose up -d
abbr -a dcd docker compose down
abbr -a k kubectl

También puedes exportar tus abreviaturas actuales a un archivo:

abbr > ~/.config/fish/conf.d/abbreviations.fish

Esto las guarda en un formato que Fish puede cargar directamente.

Mi configuración de abreviaturas

Esto es lo que uso realmente:

# Git
abbr -a gs git status
abbr -a ga git add
abbr -a gaa git add --all
abbr -a gc git commit
abbr -a gcm --set-cursor "git commit -m '%'"
abbr -a gp git push
abbr -a gl git log --oneline
abbr -a gco git checkout
abbr -a gd git diff
abbr -a gb git branch

# Docker
abbr -a dc docker compose
abbr -a dcu docker compose up -d
abbr -a dcd docker compose down
abbr -a dcl docker compose logs -f
abbr -a dps docker ps

# Navegación
abbr -a -p anywhere L "| less"
abbr -a -p anywhere G "| grep"

# Sistema
abbr -a sa sudo apt
abbr -a sai sudo apt install

Si estás configurando Fish por primera vez, revisa mi guía de instalación de Fish Shell. Para plugins que complementan las abreviaturas, mira los mejores plugins y herramientas para Fish Shell. Y para una visión más amplia de Fish comparado con otros shells, lee Fish Shell vs Bash vs Zsh o la comparación enfocada Fish vs Zsh. También te puede interesar explorar el autocompletado y sugerencias de Fish, que combinan muy bien con las abreviaturas.