Características únicas de bash en comparación con zsh

67

He sido usuario de zsh durante bastante tiempo (antes de ese tcsh y antes de ese csh). Estoy bastante contento con eso, pero me preguntaba si hay características convincentes de bash que no existan en zsh. Y a la inversa, ¿hay características zsh que no existen en bash? Mi sensación actual es que bash es mejor:

  • Si ya está familiarizado con él y no desea aprender una nueva sintaxis.
  • Va a existir en la mayoría de las máquinas * nix de forma predeterminada, mientras que zsh puede ser una instalación adicional.

No estoy tratando de comenzar una batalla religiosa aquí, por eso solo estoy buscando características que existen en solo uno de los proyectiles.

Tim
fuente
10
¿Cómo son subjetivas las características que son exclusivas de uno u otro? Sinceramente, no estoy buscando una guerra de llamas y reconozco que la familiaridad de uno u otro es probablemente una buena razón para preferir ese caparazón.
Tim

Respuestas:

40

zsh es para vulcanos. ;-)

En serio: bash 4.0 tiene algunas características que anteriormente solo se encontraban en zsh, como ** globbing:

% ls /usr/src/**/Makefile

es equivalente a:

% find /usr/src -name "Makefile"

pero obviamente más poderoso.

En mi experiencia, la finalización programable de bash funciona un poco mejor que la de zsh, al menos en algunos casos (completando paquetes de Debian por aptitud, por ejemplo).

bash tiene Alt + .que insertar!$

zsh has expansion of all variables, so you can use e.g.

% rm !$<Tab>

for this. zsh can also expand a command in backtics, so

% cat `echo blubb | sed 's/u/a/'`<Tab>

yields

% cat blabb

I find it very useful to expand rm *, as you can see what would be removed and can maybe remove one or two files from the commmand to prevent them from being deleted.

Also nice: using the output from commands for other commands that do not read from stdin but expect a filename:

% diff <(sort foo) <(sort bar)

From what I read bash-completion also supports completing remote filenames over ssh if you use ssh-agent, which used to be a good reason to switch to zsh.

Aliases in zsh can be defined to work on the whole line instead of just at the beginning:

% alias -g ...="../.."
% cd ...
0x89
fuente
8
En bash, C-M-ea "ampliar la cáscara-line", que se expandiría cat `echo blubb | sed 's/u/a/'` a cat blabby echo $SHELLque echo /bin/bashen mi caso. Además, C-x *a "glob-expand-word", que se expandiría rm *.
Victor
16

Me gustaría señalar que bash no está instalado de forma predeterminada en FreeBSD, OpenBSD o NetBSD, y tampoco está instalado de forma predeterminada en Solaris 10 (OpenSolaris lo tiene por defecto), la última vez que usé un AIX, o Los servidores HP-UX tampoco se instalaron de manera predeterminada.

Además, en OpenSolaris / bin / sh NO es bash. Es ksh. Los mayores problemas que tengo como portero de software son las personas que asumen que / bin / sh es bash y que aceptará la sintaxis extendida de bash. Si bien este parece ser el caso en la mayoría de las distribuciones de Linux, no es el caso en otros lugares y es realmente molesto.

X-Istence
fuente
66
Sí, tiene usted razón. Por desgracia, todos estos proveedores hacen que sea muy fácil instalar bash como un paquete adicional. +1 para señalar la necesidad de / bin / sh purism en scripts.
kubanczyk
@kubanczyk: Si está trabajando en máquinas a las que no tiene acceso de root, entonces puede que no sea tan fácil de instalar, así que creo que el punto de X-Istence se mantiene. (Trabajo en un montón de cajas de Solaris, y los administradores de sistemas son todos adictos a ksh. La última vez que intenté compilar mi propio software sin el que no podría vivir (git en este caso) hubo deficiencias con el compilador instalado, así que incluso esa ruta se cortó para mí.)
iconoclasta
12

Aunque soy un usuario bash, encuentro una de las características de zsh bastante genial: RPS1.

Recuerda:

  • PS1: el indicador alineado a la izquierda
  • RPS1: el indicador alineado a la derecha

Muestra:

Cuando se usa algo como

PS1=’%B(%h) %m%#%b 
RPS1=’(%20<…<%~)'

Obtiene su mensaje a la izquierda y el directorio actual empujado a la derecha. ¡Incluso desaparece cuando la línea actual se está alargando demasiado! Es porque zsh es lo suficientemente inteligente como para dar baja prioridad a RPS1.

Puede ver una captura de pantalla de este ejemplo en http://imgur.com/OAZhC .

Chucky
fuente
9

Zsh tiene corrección ortográfica. Si tiene una carta (o más) de descuento, descubrirá lo que quiso decir.

También tiene una finalización de pestañas más robusta, que me gusta.

Zsh tiene una utilidad de configuración interactiva para configurarlo como desee.

Algunas pruebas de velocidad dicen que zsh es más rápido, pero no he notado ninguna diferencia.

Mago
fuente
1
Una versión simplificada de dash que solo admite un subconjunto de sus características, y diseñada para usarse en scripts que deberían ejecutarse rápidamente (los de inicio, por ejemplo) es dash.
Chucky
zshincluso tiene una configuración para permitir los tipos de letra 'una letra apagada' para el uso del teclado Dvorak.
vgoff
6

No conozco ninguna función bash que zsh no admita. El objetivo de diseño de zsh parece incluir el soporte de cualquier característica que bash agregue.

Todavía uso bash en lugar de zsh. Raramente encuentro características atractivas que zsh admite que bash no. Los problemas ocasionales con zsh a lo largo de los años, o que no existen en ciertos sistemas, han hecho que no valga la pena hacer la transición.

Finalmente puedo usar el mismo shell en todos los sistemas Unix, no vale la pena romper esto para las funciones que nunca usaré.

Las características presentes en zsh que no están presentes en bash parecen ser en su mayoría lindas, pero no las que serían importantes en el día a día.

carlito
fuente
3

bash tiene muchas características que solían estar solo en zsh. Ahora puede tener 'finalización inteligente de pestañas' con bash, como descubrió cualquier usuario reciente de ubuntu.

Rory
fuente
1

La sustitución de procesos y el globbing extendido son las dos características que más extrañaría. La configuración del indicador también es bastante buena: ver el nivel de anidamiento al escribir declaraciones complejas en las líneas de comando. La carga automática hace posible incluir muchas funciones en cada shell.


fuente
Supongo que quiere decir que los extrañaría de zsh, ya que AFAIK todo lo que mencionó está incluido en zsh. (¿Pero estás seguro de que todos están ausentes de bash? Eso me sorprendería). De todos modos, agregar eso aclararía tu respuesta, ya que hay personas que responden a ambos lados de la cerca de bash / zsh. Además, sería útil dar ejemplos de cómo cada una de esas características facilita la vida de su shell.
iconoclasta
0

Soy fanático de zsh debido al soporte del modo vi, pero estoy descubriendo que no es muy utilizado. Creo que leí que a zsh le gusta tomar características populares de los otros shells y combinarlas (por lo que las cosas específicas de bash y las específicas de csh están disponibles en zsh).

Alguien también dijo que estoy flexionando mi factor geek usando zsh, pero no puedo confirmar ni negar ese rumor.

Milner
fuente
55
y sí, bash también tiene soporte para modo vi.
pjz
@Milner: ¿puedes explicar qué tipo de soporte de modo vi está en zsh que no está en bash? Si simplemente te refieres a la capacidad de hacer set -o vi en la línea de comando, entonces eso está claramente en ambos. Si hay algún soporte extendido en zsh, ¿podría describir claramente qué es y qué agrega?
iconoclasta
-1

Popularidad, #bash 430 usuarios. #zsh 123 usuarios. Creo que el sitio web de zsh tiene una buena comparación de zsh con otros shells. zsh tiene mejor soporte para el modo vi.

Ian Kelling
fuente
2
¿Cómo es mejor el modo vi en zsh? Soy un usuario bash y tengo el modo vi activado, así que me gustaría saber si hay algún beneficio en el cambio.
ptman
1
@ptman: se puede hacer que la solicitud de zsh indique el modo (insert / normal). Readline no puede hacer eso. El apuntador también es más flexible: puede resaltar la sintaxis, etc.
unperson325680
@progo: ahh! muy agradable. Ahora podría comenzar a usar el modo vi en zsh. Esa ha sido una de mis razones para seguir con el modo emacs hasta ahora.
iconoclasta
@Brandon, esa pequeña mejora fue la razón por la que cambié las conchas.
unperson325680
-1

Bash está usando la misma sintaxis para if y while que puede usarse en los scripts / bin / sh en la línea de comando.
Dentro de zsh la sintaxis es diferente. Efectivamente, usando zsh, debe recordar ambos, si está usando una instrucción if o while en su línea de comando

Michèle
fuente
1
Intenté esto, usando if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fitanto la línea de comando como un script, y funcionó como se esperaba en ambos casos. Por lo tanto, parece que no tienes tus datos claros.
iconoclasta
Esto depende de lo que haya instalado como / bin / sh. Si / bin / sh es bash, entonces tienes razón. De lo contrario, bash no tiene esta ventaja. Si zsh es / bin / sh, zsh tiene esta ventaja. Teniendo en cuenta todos los shells diferentes que podrían proporcionar / bin / sh, personalmente recomiendo usar solo el shell que desea para el script de shell, de modo que su ausencia apunte a un problema con una solución obvia, en lugar de comportamientos extraños sin tener idea de cómo hacerlo. resolver.
Ed Grimm