¿Qué características están en zsh y faltan en bash, o viceversa?

62

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?
Macha
fuente
55
@Gilles algún día podría ser bueno tener a todos los que se mudaron aquí ... y fusionarse
xenoterracide

Respuestas:

45

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íficos son un poco difíciles de recordar pero extremadamente convenientes (como en, a menudo es más rápido buscarlos que escribir el findcomando equivalente ). Algunos de los ejemplos más simples:
        foo*~*.bak= todas las coincidencias foo*excepto aquellas que coinciden *.bak
        foo*(.)= solo coincidencia de archivos regulares foo*
        foo*(/)= solo coincidencia de directorios foo*
        foo*(-@)= solo enlaces simbólicos colgantes coincidentes foo*
        foo*(om[1,10])= los 10 archivos más recientes coincidentes foo*
        foo*(Lm+1)= solo archivos de tamaño> 1 MB = en el directorio y todos sus subdirectorios, recursivamente⁴
        dir/**/foo*foo*dir

  • Para cambios de nombre sofisticados, el zmvincorporado puede ser útil. Por ejemplo, para copiar cada filea file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • Tanto bash como zsh tienen un sistema de finalización decente que debe activarse explícitamente ( . /etc/bash_completiono autoload -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, ejecutar autoload 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" excepto beep. 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.

Gilles 'SO- deja de ser malvado'
fuente
55
Bash 4.0 ahora es compatible con la autocdfunción que discute anteriormente. Habilite la función usando el comando shopt -s autocd. Entonces la función funciona como lo has descrito.
Philluminati
zsh también tiene el wherecomando incorporado , que no debe confundirse con el whichcomando.
Sildoreth
@EdGrimm Creo que GNU y FreeBSD find pueden hacer todo lo que pueden hacer los calificadores zsh glob (con -execun shell para cosas como la selección con ey una tubería hacia herramientas como sorty sedpara reescribir ey ordenar). Mucho más verbosamente, por supuesto.
Gilles 'SO- deja de ser malvado'
Después de comprobar y volver a comprobar la página de búsqueda de más de una década, creo que dejé de buscar. Pero si hubiera marcado una última vez antes de comentar, al menos habría visto que la opción -size ahora reduce las unidades a bytes.
Ed Grimm
11

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.

ocodo
fuente
no lo hizo ¿ setoptQué opción no predeterminada utiliza para eso (si corresponde)?
Me di cuenta de que lo había _-.configurado como comodín. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . Ver stackoverflow.com/q/7906078/311660
ocodo
10

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

Pedro Silva
fuente
2
Bash hace esto, al menos a partir de la versión 4.2.37; reemplaza las nuevas líneas por punto y coma y le da una sola línea para editar.
Keith Thompson
1
Todavía no es tan agradable. (:
SilverWolf
8

Bash tiene la característica de poder abrir puertos usando

/dev/tcp/host/port

o

/dev/udp/host/port

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]

Portablejim
fuente
55
zsh tiene el ztcp incorporado, aunque tiene más capacidades que bash / dev / tcp, no tiene / dev / udp. Sin embargo, preferiría usar socat.
Stéphane Chazelas
2

Que - mejorado en zsh

El whichcomando en bash solo revela la ubicación de un comando.

En Zsh whichrevelará la definición de an alias, la fuente de ay functionla ubicación de un comando.

Digamos que teníamos un alias de shell:

alias gg='git log'

En Bash si preguntamos: which ggel resultado sería nulo

En Zsh: which ggnos dará ...

gg: aliased to git log

Digamos que teníamos una función de shell:

hello() {
    echo "Hello World"
}

En Bash si preguntamos: which helloel resultado sería nulo.

En Zsh: which hellonos dará ...

hello() {
    echo "Hello World"
}
ocodo
fuente
Bash proporciona la misma funcionalidad a través del typecomando (incorporado). Y solo para señalar: whiches un comando externo, no un bash incorporado.
Torkel Bjørnson-Langen
Pregunta canónica relevante: ¿Por qué no usar "which"? ¿Qué usar entonces?
Anthony G - justicia para Monica
0

zsh: un shell completo

hay muchos, leer zshcontrib(1)uno puede detectar dos versiones de juegos autoloadhabilitables tetris(el otro con ncurses) zshen competencia con emacs, para completar (como se describe).

=

Me gustaría mencionar la =palabra clave, que puede causar irritación con curl(las URL generalmente tienen ?var=valen ellas; pero unsetoptcreo 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 decir man,), Alt + ? ( which-command) varedy zed( 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 ejemplo csh, kshcon emulate) y autoload run-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 en readline(en oposición a zle) y gnu 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-specific bind.

conclusión

Personalmente, creo emacs(especialmente por la perspectiva del emacs-noxsabor (¿actual?) ) Como la inspiración para un software excepcional como zshe tmuxhice un muy buen trabajo como ejemplo en dicha implementación; para las personas que aprecian su valor (al nivel de no necesitar / dependiendo del Xservidor). 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).

ocodo
fuente