it-swarm-es.tech

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

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?
63
Macha

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 uso ocasionalmente bash es autocd: en zsh, ejecutar un directorio significa cambiar a él, siempre que active la opción autocd.

  • Otra característica muy útil es el globbing elegante. los jeroglíficoslos caracteres son un poco difíciles de recordar pero extremadamente convenientes (como en, a menudo es más rápido buscarlos que escribir el comando find equivalente). Algunos de los ejemplos más simples:
    foo*~*.bak = Todas las coincidencias para foo* Excepto las que coinciden *.bak
    foo*(.) = solo archivos regulares que coinciden foo*
    foo*(/) = solo directorios que coinciden foo*
    foo*([email protected]) = solo enlaces simbólicos colgantes que coinciden foo*
    foo*(om[1,10]) = los 10 archivos más recientes que coinciden foo*
    foo*(Lm+1) = solo archivos de tamaño> 1 MB
    dir/**/foo* = foo* En el directorio dir y todos sus subdirectorios, recursivamente rec

  • Para cambios de nombre sofisticados, el zmv incorporado puede ser útil. Por ejemplo, para copiar cada file A 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_completion O autoload -U compinit; compinit). Zsh's es mucho más configurable y generalmente más elegante.

Si ejecuta zsh sin un .zshrc, Se inicia un menú interactivo que le permite elegir las opciones de configuración. (Algunas distribuciones pueden desactivar esto; en ese caso, ejecute 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.

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.

11
ocodo

zsh le permite editar un comando de varias líneas (vea editor de línea zsh ), bash no. Si intentas el mismo truco (Ctrl-p), bash obtiene el último comando.

10
Pedro Silva

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 debe hacer un Shell. Más información [lista de correo de Debian]

8
Portablejim

Que - mejorado en zsh

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

En Zsh which revelará la definición de un alias, la fuente de un function y la ubicación de un comando.

Digamos que teníamos un alias de Shell:

alias gg='git log'

En Bash si preguntamos: which gg el resultado sería nulo

En Zsh: which gg nos dará ...

gg: aliased to git log

Digamos que teníamos una función Shell:

hello() {
    echo "Hello World"
}

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

En Zsh: which hello nos dará ...

hello() {
    echo "Hello World"
}
2
ocodo

zsh - un Shell completo

hay muchos, leyendo zshcontrib(1) uno puede detectar dos versiones de autoload - juegos tetris capaces (el otro con ncurses) en zsh en 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=val En ellas; pero es unsetopt capaz , Yo creo que):

  • q file =less (gentoo) se resuelve en q file $(which less)

= Se expande a la ruta completa del comando en cuestión.

otras golosinas

otras cosas, fuera de la mente, son el mensaje correcto RPS1=%d (para mostrar $PWD con estilo), Alt + H (run-help Es decir man), Alt + ? (which-command), vared y zed (autoload función), tipo minibúfer de Emacs Alt + X para ejecutar widgets sin vincularlos, alias globales y sufijos, duración de finalización del comando de seguimiento de historial extendido, coincidencias -m y -regex, emulación de Shell (por ejemplo, csh, ksh con emulate) y autoloadrun-help con 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).

bash parece estar más distribuido en readline (en oposición a zle) y gnu history En 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 en ~/.inputrc y /etc/inputrc) si no se anula por bash-específicas bind.

conclusión

Personalmente, creo que emacs (especialmente de la perspectiva de (¿el actual?) emacs-nox Sabor) es la inspiración para el software excepcional como zsh y tmux hizo un muy buen trabajo al ser un ejemplo en tal implementación; para las personas que aprecian su valor (al nivel de no necesitar/dependiendo del servidor X). Unix Shell es lo suficientemente potente, y su continuidad y consistencia son suficientes para un flujo de trabajo y productividad adecuados (en computación general).

0
user86041