Como usuario de Linux, siempre he usado bash porque era el valor predeterminado en cada distribución que usaba. Las personas que usan otros sistemas Unix, como BSD, parecen usar otros shells con mucha más frecuencia. En aras de aprender un poco más, he decidido probar zsh.
Como usuario bash:
- ¿Qué características voy a extrañar?
- ¿Y cuáles debo tener en cuenta?

Respuestas:
Ya ha habido bastante actividad sobre el tema en otros sitios de Stack Exchange. Mi experiencia de cambiar de bash a zsh, hasta donde puedo recordar (fue hace años²), es que no me perdí nada. Gané mucho; Esto es lo que creo que son las características simples específicas de zsh que más uso:
La característica de zsh que más extraño cuando ocasionalmente uso bash es autocd: en zsh, ejecutar un directorio significa cambiar a él, siempre que active la
autocdopción.Otra característica muy útil es el globbing elegante. Los caracteres
jeroglíficosson un poco difíciles de recordar pero extremadamente convenientes (como en, a menudo es más rápido buscarlos que escribir elfindcomando equivalente ). Algunos de los ejemplos más simples:foo*~*.bak= todas las coincidenciasfoo*excepto aquellas que coinciden*.bakfoo*(.)= solo coincidencia de archivos regularesfoo*foo*(/)= solo coincidencia de directoriosfoo*foo*(-@)= solo enlaces simbólicos colgantes coincidentesfoo*foo*(om[1,10])= los 10 archivos más recientes coincidentesfoo*foo*(Lm+1)= solo archivos de tamaño> 1 MB = en el directorio y todos sus subdirectorios, recursivamente⁴dir/**/foo*foo*dirPara cambios de nombre sofisticados, el
zmvincorporado puede ser útil. Por ejemplo, para copiar cadafileafile.bak:zmv -C '(*)(#q.)' '$1.bak'Tanto bash como zsh tienen un sistema de finalización decente que debe activarse explícitamente (
. /etc/bash_completionoautoload -U compinit; compinit). Zsh's es mucho más configurable y generalmente más elegante.Si ejecuta zsh sin a
.zshrc, se inicia un menú interactivo que le permite elegir las opciones de configuración. (Algunas distribuciones pueden deshabilitar esto; en ese caso, ejecutarautoload zsh-newuser-install; zsh-newuser-install). Recomiendo habilitar las opciones de historial recomendadas, activar la finalización ("estilo nuevo") y activar las "opciones de shell comunes" exceptobeep. Más tarde, configure más opciones a medida que las descubra.² En ese momento, la finalización programable era la característica asesina de zsh, pero bash la adquirió poco después.
⁴ Las características que bash adquirió solo en la versión 4 (por lo que todavía no están disponibles en muchos sistemas) son de tipo más pequeño.
fuente
autocdfunción que discute anteriormente. Habilite la función usando el comandoshopt -s autocd. Entonces la función funciona como lo has descrito.wherecomando incorporado , que no debe confundirse con elwhichcomando.-execun shell para cosas como la selección coney una tubería hacia herramientas comosortysedpara reescribirey ordenar). Mucho más verbosamente, por supuesto.Además, la finalización de la pestaña predeterminada es mejor que bash ... por ejemplo ...
~/.e.dTAB se expandirá a~/.emacs.d/en zsh, bash solo emitirá un pitido.fuente
setoptQué opción no predeterminada utiliza para eso (si corresponde)?_-.configurado como comodín.zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'. Ver stackoverflow.com/q/7906078/311660zshle permite editar un comando de varias líneas (consulte el editor de líneas zsh ), bash no. Si intentas el mismo truco (Ctrl-p), bash obtiene el último comando.fuente
Bash tiene la característica de poder abrir puertos usando
o
Sin embargo, está deshabilitado en Debian ya que se ve como un obstáculo (si la ruta realmente existe) y está fuera del alcance de lo que debería hacer un shell. Más información [lista de correo debian]
fuente
Que - mejorado en zsh
El
whichcomando en bash solo revela la ubicación de un comando.En Zsh
whichrevelará la definición de analias, la fuente de ayfunctionla ubicación de un comando.Digamos que teníamos un alias de shell:
En Bash si preguntamos:
which ggel resultado sería nuloEn Zsh:
which ggnos dará ...Digamos que teníamos una función de shell:
En Bash si preguntamos:
which helloel resultado sería nulo.En Zsh:
which hellonos dará ...fuente
typecomando (incorporado). Y solo para señalar:whiches un comando externo, no un bash incorporado.zsh: un shell completo
hay muchos, leer
zshcontrib(1)uno puede detectar dos versiones de juegosautoloadhabilitablestetris(el otro conncurses)zshen competencia conemacs, para completar (como se describe).=
Me gustaría mencionar la
=palabra clave, que puede causar irritación concurl(las URL generalmente tienen?var=valen ellas; perounsetoptcreo que es posible):q file =less(gentoo) resuelve aq file $(which less)=se expande a la ruta completa del comando en cuestión.otras golosinas
otras cosas, fuera de la mente, son el indicador correcto
RPS1=%d(para mostrar$PWDcon estilo), Alt + H(run-helpes decirman,), Alt + ? (which-command)varedyzed(autoloadfunción), como minibúfer de Emacs Alt + Xpara ejecutar widgets sin vincularlos, alias globales y sufijos, duración extendida de finalización del comando de seguimiento del historial,-my-regexcomparadores, emulación de shell (por ejemplocsh,kshconemulate) yautoloadrun-helpcon fragmentos de archivo para los elementos integrados.lamentaciones
Creo que la mayoría de las características, si no todas, se implementaron hace mucho tiempo, y al leer los registros de cambios, no hay cambios importantes ni nuevas funciones, lo cual es muy triste (ya no hay nada que explorar y descubrir).
bashparece estar más distribuido enreadline(en oposición azle) ygnu historyen el espíritu de Linux; por ejemplo, las funciones de lectura de líneas y las combinaciones de teclas se pueden aplicar globalmente (como se mantiene~/.inputrcy/etc/inputrc) si no se anula por bash-specificbind.conclusión
Personalmente, creo
emacs(especialmente por la perspectiva delemacs-noxsabor (¿actual?) ) Como la inspiración para un software excepcional comozshetmuxhice un muy buen trabajo como ejemplo en dicha implementación; para las personas que aprecian su valor (al nivel de no necesitar / dependiendo delXservidor). Unix shell es lo suficientemente potente, y su continuidad y consistencia son suficientes para un flujo de trabajo y una productividad adecuados (en informática general).fuente