Fish Shell vs Zsh - ¿Cuál Deberías Elegir?
Una comparación práctica de Fish Shell y Zsh para uso diario en la terminal, cubriendo autocompletado, plugins, scripting, configuración y cuál shell se adapta mejor a tu flujo de trabajo.
Usé Zsh con Oh My Zsh durante unos tres años antes de pasarme a Fish. Los dos son una mejora grande frente a Bash, pero toman enfoques diferentes para llegar ahí. Zsh te da un shell compatible con POSIX que vas construyendo con plugins. Fish te da una experiencia pulida desde el primer arranque pero rompe con las convenciones POSIX.
Si quieres ver cómo se comparan los tres shells, revisa mi comparación de Fish vs Bash vs Zsh. Este artículo profundiza solo en Fish y Zsh.
Experiencia desde el primer momento
Aquí es donde Fish y Zsh más difieren.
Fish te da autosugerencias, resaltado de sintaxis, completado con tab enriquecido y análisis de páginas man desde una instalación nueva. Abres una terminal y todo funciona. Sin configuración, sin plugins, sin framework.
Zsh recién instalado es… básico. Está un paso por encima de Bash, con mejor globbing y algunas funcionalidades integradas, pero la experiencia que la mayoría asocia con Zsh viene de Oh My Zsh y sus plugins. Necesitas instalar zsh-autosuggestions para sugerencias basadas en el historial y zsh-syntax-highlighting para coloreado de comandos.
Si te importa el tiempo hasta ser productivo, Fish gana por un margen amplio. Cambias flexibilidad de configuración por un shell que simplemente funciona.
Autosugerencias
Los dos shells pueden mostrar sugerencias en línea de tu historial de comandos mientras escribes. La diferencia es que Fish lo hace por defecto y Zsh necesita un plugin.
En Fish, presiona la flecha derecha para aceptar la sugerencia completa o Alt+Right para aceptar una palabra a la vez. Fish también combina sugerencias del historial con completados de rutas de archivos y comandos. Entro en más detalle en mi guía de autocompletado y sugerencias de Fish Shell.
En Zsh con zsh-autosuggestions, el comportamiento es similar pero puede sentirse un poco menos pulido. El plugin a veces entra en conflicto con otros completados o temas, y puede que necesites ajustar tu configuración para que funcione bien.
Completado con tab
El sistema de completado con tab de Fish es más sofisticado de serie. Lee páginas man y genera completados automáticamente, así que comandos que nunca has configurado igualmente obtienen resultados útiles con tab. Escribe rsync -- y presiona tab, y verás todos los flags disponibles con descripciones.
Fish también muestra los completados en una lista tipo paginador con descripciones junto a cada opción. Navegas con las teclas de flecha y presionas enter para seleccionar.
Zsh también tiene un sistema de completado potente (compinit más configuración zstyle), y puede igualar a Fish una vez configurado correctamente. Pero “configurado correctamente” es la frase clave. La mayoría de usuarios de Zsh dependen de Oh My Zsh o frameworks para manejar esto, e incluso así rara vez es tan completo como lo que Fish genera a partir de las páginas man.
Sintaxis
Este es el punto de decisión real para mucha gente.
Zsh es mayormente compatible con POSIX. Los scripts de Bash se ejecutan en Zsh con cambios mínimos, y los scripts de Zsh se ven casi idénticos a los de Bash:
# Zsh
export MY_VAR="hello"
if [[ -f "$HOME/.zshrc" ]]; then
source "$HOME/.zshrc"
fi
my_list=("one" "two" "three")
for item in "${my_list[@]}"; do
echo "$item"
done
Fish tiene su propia sintaxis. Es posiblemente más limpia, pero es diferente:
# Fish
set -gx MY_VAR "hello"
if test -f ~/.config/fish/config.fish
source ~/.config/fish/config.fish
end
set my_list one two three
for item in $my_list
echo $item
end
La versión de Fish tiene menos puntuación. Sin [[ ]], sin do/done, sin punto y coma, sin expansión de variables estilo ${}. Las variables son simplemente $name, las listas no necesitan comillas alrededor de cada elemento, y los bloques terminan con end en lugar de fi/done/esac.
El compromiso: no puedes pegar comandos de Bash directamente. Cosas como export VAR=value (usa set -gx VAR value), $(command) para sustitución de comandos (usa (command)), y && entre comandos (usa ; and o && desde que Fish 3.0 agregó soporte) necesitan ajustes.
Fish sí soporta && ahora
Fish 3.0 agregó soporte para && y ||. Así que command1 && command2 funciona. Las guías antiguas que dicen lo contrario están desactualizadas.
Ecosistema de plugins
Zsh tiene el ecosistema más grande gracias a Oh My Zsh, que existe desde 2009. Hay más de 300 plugins incluidos, más de 150 temas y una comunidad masiva. Gestores alternativos como zinit, antigen y zplug ofrecen carga más rápida. Tengo una lista de los mejores plugins de Oh My Zsh si te interesa.
Fish tiene un ecosistema más pequeño pero enfocado. Fisher es el gestor de plugins recomendado, es rápido y no se interpone en tu camino. Los plugins populares incluyen Tide (un prompt), fzf.fish (integración de búsqueda difusa) y nvm.fish (gestión de versiones de Node). Los cubro en mejores plugins y herramientas de Fish Shell.
Oh My Fish existe como framework alternativo, pero lleva un tiempo sin mantenimiento. Fisher es la opción recomendada. Si aún tienes curiosidad sobre OMF, mira mi guía de Oh My Fish.
Algo que vale la pena mencionar: Fish necesita menos plugins para empezar. Las funcionalidades que requieren un plugin en Zsh (autosugerencias, resaltado de sintaxis, buenos completados) vienen integradas en Fish. Así que mientras Zsh tiene más plugins disponibles, los usuarios de Fish necesitan menos.
Complejidad de configuración
La configuración de Zsh puede volverse elaborada. Un .zshrc típico con Oh My Zsh incluye selección de tema, listas de plugins, alias personalizados, configuración de rutas y opciones del framework. No es raro terminar con un .zshrc de 100 líneas. Oh My Zsh también añade un tiempo de inicio medible, especialmente con muchos plugins activados.
La configuración de Fish tiende a ser más corta. Tu ~/.config/fish/config.fish puede tener solo adiciones de rutas y algunas abreviaturas. Fish también soporta conf.d/ para dividir la configuración en archivos separados, y la interfaz web fish_config te permite cambiar colores y prompts sin editar archivos.
El sistema de abreviaturas de Fish también reduce lo que pones en los archivos de configuración. En lugar de definir funciones de shell para comandos comunes, agregas abreviaturas que se expanden en línea.
Personalización del prompt
Los temas de Zsh a través de Oh My Zsh te dan cambios rápidos de prompt. Powerlevel10k es la opción más popular, es rápido y tiene un asistente de configuración. También puedes usar Starship, que cubrí en mi guía de Starship y Ghostty.
Fish tiene Tide como su opción de prompt nativa, con un asistente de configuración similar a Powerlevel10k. Starship también funciona con Fish. Escribí una guía sobre cómo configurar Starship con Fish Shell, y una comparación más amplia de temas y prompts de Fish Shell que cubre Tide, Starship, Pure y Hydro.
Los dos shells funcionan bien con Starship si quieres un prompt consistente entre shells.
Scripting
Si escribes scripts de automatización que necesitan ejecutarse en diferentes sistemas, Zsh (o Bash) es la opción más segura. Los scripts de Zsh se ejecutan en macOS (donde Zsh es el shell predeterminado) y en la mayoría de sistemas Linux con Zsh instalado. Los scripts de Bash se ejecutan en todas partes.
Los scripts de Fish solo se ejecutan en Fish. Para automatización, mantengo mis scripts como archivos Bash con shebangs #!/bin/bash y los ejecuto desde Fish. Esta es la recomendación estándar en la comunidad de Fish. Fish está pensado para ser tu shell interactivo, no necesariamente tu lenguaje de scripting para automatización portable.
Dicho esto, la sintaxis de scripting de Fish es agradable para cosas específicas de Fish como completados personalizados, funciones de prompt y manejadores de abreviaturas. Mira mi guía de funciones de Fish Shell para ejemplos.
Comparación de rendimiento
| Métrica | Fish 4.5 | Zsh (con Oh My Zsh) | Zsh (básico) |
|---|---|---|---|
| Tiempo de inicio | ~30ms | 200-800ms | ~40ms |
| Respuesta interactiva | Instantánea | Depende de plugins | Rápida |
| Uso de memoria | ~15MB | ~20-40MB | ~10MB |
| Escrito en | Rust | C | C |
Fish 4.0 fue reescrito en Rust (febrero de 2025), y la última versión es 4.5.0. El inicio es rápido y la respuesta interactiva es inmediata. Zsh con Oh My Zsh y varios plugins puede tener un retraso notable al iniciar, aunque esto varía mucho dependiendo de qué plugins tengas activados.
Entonces, ¿cuál elegir?
Elige Fish si:
- Quieres que las cosas funcionen de inmediato sin configurarlas
- Pasas la mayor parte del tiempo ejecutando comandos de forma interactiva, no escribiendo scripts de shell
- Las diferencias con la sintaxis POSIX no te molestan
- Prefieres un ecosistema de plugins más pequeño y enfocado frente a uno enorme
Elige Zsh si:
- Quieres compatibilidad con Bash para poder pegar comandos de tutoriales sin cambios
- Te gusta tener un ecosistema de plugins masivo con muchos temas
- Escribes scripts de shell que necesitan ser portables
- Ya estás cómodo con tu configuración de Zsh y no te sientes limitado por ella
Si actualmente estás en Bash y buscas mejorar, te sugiero probar Fish primero. La barrera para probarlo es baja. Solo instálalo en Ubuntu (o en macOS), ejecuta fish, y úsalo un día. No tienes que establecerlo como tu shell predeterminado para probarlo. Si las diferencias de sintaxis te molestan demasiado, cámbiate a Zsh en su lugar.