Zsh
Zsh es el shell predeterminado en macOS. Es altamente personalizable y compatible con Bash.
Cuándo Usarlo
- Shell interactivo de alta productividad: Autocompletación interactiva, navegación difusa, búsqueda en el historial e indicadores de rama.
- Ecosistema moderno de plugins CLI: Acelerar flujos de trabajo del shell con
zsh-autosuggestions,zsh-syntax-highlightingy el prompt Starship. - Scripting robusto de shell: Creación de scripts de automatización compatibles con POSIX y extendidos de Zsh con manipulación de arreglos y globbing.
- Gestión de entornos empresariales: Administración de versiones de SDK, exportaciones de PATH y alias en servidores macOS y Linux.
Inicio Rápido
1. Configuración Mínima de ~/.zshrc
# Configuración del historial
HISTFILE="$HOME/.zsh_history"
HISTSIZE=50000
SAVEHIST=50000
setopt HIST_IGNORE_DUPS
setopt SHARE_HISTORY
# Atajos de teclado (modo emacs)
bindkey -e
# Autocompletación
autoload -Uz compinit && compinit
# Alias
alias ll="ls -lah"
alias g="git"
alias gs="git status -sb"
2. Medir el Tiempo de Inicio
# Perfil de duración de inicio de zsh
time zsh -i -c exit
Conceptos Clave
Zshrc Moderno y Rápido (~/.zshrc)
Configurando inicio del shell en menos de 20ms, autocompletación inteligente e historial:
# ~/.zshrc
# Configuración del historial
HISTFILE="$HOME/.zsh_history"
HISTSIZE=50000
SAVEHIST=50000
setopt EXTENDED_HISTORY
setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_VERIFY
setopt SHARE_HISTORY
# Opciones de navegación de directorios
setopt AUTO_CD
setopt AUTO_PUSHD
setopt PUSHD_IGNORE_DUPS
setopt PUSHD_SILENT
# Sistema de autocompletación rápido (con caché)
autoload -Uz compinit
typeset -i updated_at=$(date +'%j' -r ~/.zcompdump 2>/dev/null || stat -f '%Sm' -t '%j' ~/.zcompdump 2>/dev/null)
if [ $(date +'%j') != $updated_at ]; then
compinit -i
else
compinit -C -i
fi
# Atajos de teclado modernos: búsqueda en el historial
bindkey -e
bindkey '^[[A' history-search-backward
bindkey '^[[B' history-search-forward
# Inicializar el prompt Starship (si está instalado)
if command -v starship &> /dev/null; then
eval "$(starship init zsh)"
fi
Carga Ligera de Plugins sin Frameworks Pesados
Cargando autosuggestions y syntax highlighting directamente:
# Clonar plugins en ~/.zsh/plugins/
# git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/plugins/zsh-autosuggestions
# git clone https://github.com/zsh-users/zsh-syntax-highlighting ~/.zsh/plugins/zsh-syntax-highlighting
source ~/.zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
source ~/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# Configurar color de sugerencia
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=8'
Globbing y Expansión de Parámetros Avanzados en Zsh
Uso de globbing recursivo y modificadores:
# Listar todos los archivos TypeScript modificados en las últimas 24 horas
ls -lh **/*.ts(m-1)
# Eliminar todos los directorios vacíos recursivamente
rmdir -p **/*(/^F) 2>/dev/null
# Seleccionar solo archivos ejecutables en bin/
chmod +x bin/*(*)
Patrones Comunes
Carga Rápida de Plugins con Zinit
Problema: El inicio de Oh My Zsh toma cientos de milisegundos debido a la carga pesada y temprana.
Solución: Usar Zinit con modo turbo (carga diferida).
# Instalar Zinit si falta
source ~/.local/share/zinit/zinit.git/zinit.zsh
# Cargar de forma turbo asyncrono syntax highlighting y autosuggestions
zinit wait lucid for \
atinit"ZINIT[COMPINIT_OPTS]=-C; zicompinit; zicdreplay" \
zdharma-continuum/fast-syntax-highlighting \
atload"_zsh_autosuggest_start" \
zsh-users/zsh-autosuggestions \
blockf \
zsh-users/zsh-completions
Funciones Robusta de Scripting de Shell
Problema: Escribir funciones reutilizables de shell con análisis de opciones y manejo de errores.
Solución: Usar expansiones de parámetros estándar de Zsh.
# mkcd: Crear directorio y entrar en él
mkcd() {
if [[ -z "$1" ]]; then
echo "Uso: mkcd <directorio>" >&2
return 1
fi
mkdir -p "$1" && cd "$1"
}
Mejores Prácticas (2026)
- Hágalo: Compile
~/.zcompdumpen un archivo compilado a bytes (compdump.zwc) para acelerar el tiempo de inicio del shell. - Hágalo: Establezca
setopt SHARE_HISTORYpara sincronizar el historial de comandos en todas las pestañas activas del terminal. - Hágalo: Use Starship o un prompt nativo ligero en lugar de temas de prompt heredados y pesados.
- Hágalo: Perfile la latencia de inicio usando
zmodload zsh/zprofal inicio y al final de~/.zshrc. - No haga: Use configuraciones de framework pesadas y monoliticas (configuraciones monolíticas de Oh-My-Zsh) con docenas de plugins innecesarios.
- No haga: Almacene credenciales de servicios en la nube en texto plano, tokens de API o secretos en
~/.zshrc; use archivos.envprivados o bóvedas de secretos. - No haga: Ejecute comandos externos lentos (
nvm,brew doctor) de forma sincrónica en cada inicio interactivo del shell.
Solución de Problemas
| Error / Síntoma | Causa | Solución |
|---|---|---|
zsh: command not found: ... después de editar .zshrc | Error de sintaxis en .zshrc o asignación de $PATH sobrescrita en lugar de antepuesta | Anteponga las rutas correctamente: export PATH="$HOME/bin:$PATH" y ejecute source ~/.zshrc. |
zsh compinit: insecure directories, run compaudit | Permisos de archivo inseguros en /usr/local/share/zsh | Ejecute `compaudit |
| Zsh inicia muy lentamente (> 500ms) | nvm sincrónico o inicialización pesada de plugins | Use carga diferida para nvm o perfile con zmodload zsh/zprof al inicio de .zshrc y zprof al final. |