¿Todos los scripts de bash son compatibles con `zsh`?


Respuestas:


56

Si sus scripts comienzan con la línea #!/bin/bash, aún se ejecutarán usando bash, incluso si su shell predeterminado es zsh.

He encontrado la sintaxis de zsh muy cercana a la de bash, y no presté atención si realmente había algunas incompatibilidades. Cambié hace 6 años de bash a zsh sin problemas.


1
¿Cuál fue su parte más difícil de cambiar?
chrisjlee

44
Ninguna. Mis scripts personales agregan la referencia adecuada a bash y había encontrado un buen .zshrc para comenzar. Zsh y bash eran lo suficientemente similares como para que realmente no me resultara un desafío.
Huygens

44
puedes enumerar tu .zshrc:)
neaumusic

1
Pero si la línea #!/bin/bashse ignorará si se ejecuta el archivo de secuencia de comandos como source ./script.sh?
LCB

3
La codificación rígida de la ruta al shell es un mal consejo, incluso si se hace con frecuencia. En su #!/usr/bin/env bashlugar, debe usarlo , especialmente en macOS, donde el bash predeterminado está muy desactualizado y las nuevas versiones prácticamente siempre se instalan en una ruta diferente.
Konrad Rudolph

29

Zsh puede ejecutar la mayoría de los scripts Bourne, POSIX o ksh88 si lo coloca en el modo de emulación correcto ( emulate sho emulate ksh). No es compatible con todas las características de bash o ksh93. Zsh tiene la mayoría de las características de bash, pero en muchos casos con una sintaxis diferente.

El shell que usa de forma interactiva es irrelevante para cualquier script que tenga. El shell que ejecuta los scripts es el indicado en la primera línea, la línea shebang . Por ejemplo, si el script comienza con #!/bin/bash, bash lo ejecutará.

Si ha personalizado bash, no será capaz de simplemente cambiar el nombre .bashrca .zshrc. Algunas cosas se pueden compartir, por ejemplo, alias y funciones, siempre que se mantenga en la intersección entre las dos capas (la intersección está cerca de ksh88 y pdksh ). Otras cosas, como la configuración del indicador, las funciones de finalización y la mayoría de las opciones, deberán reescribirse por completo.

Si está escribiendo un fragmento para que las personas lo obtengan de su .bashrco .zshrcy no desea mantener dos versiones, quédese con un subconjunto común de funciones bash y zsh, que incluye la mayoría de las funciones de programación de bash. Ponga todo su código en funciones y ponga la siguiente línea en la parte superior de cada función:

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

Puede usar en emulate shlugar de emulate kshestar más cerca de la sintaxis sh simple, que es lo que necesita .profile.

Si una función llama a otra función, la otra hereda la configuración de emulación, por lo que no necesita poner esta línea en funciones internas, solo en funciones llamadas por el usuario final.


1
El shell que usa es irrelevante si ejecuta sus scripts como ./my_script.sh. source my_script.shy . my_script.shlo ejecutará como el shell actual, ignorando cualquier shebang.
BallpointBen

3

Si el shebang es #!/bin/bashy comienzas el script, ./scriptbash ejecutará el script. Absolutamente no hay problema aquí.

Sin embargo, si lo ejecuta zsh ./scripto lo . ./scriptgenera en la instancia de zsh en ejecución, es bastante común que la sintaxis de bash y zsh no coincida.

Por ejemplo, zsh no divide las expansiones de parámetros de forma predeterminada, bash tiene una ayuda incorporada, no hay read -p prompten zsh (la sintaxis es muy diferente, lea cmd \? Prompt , arrays start on 1 (not 0) in zsh,command only search for external commands in zsh, or there is no (simple) equivalent to$ {foo ^} `(mayúscula solo el primer carácter) en zsh , entre otros. Esta es una larga lista de (en su mayoría) similitudes y algunas diferencias .

En algunos casos, se le puede decir a zsh que emule otros shells. En algunos casos, no existe una sintaxis común que sea portable a ambos shells posibles (sin usar alias o funciones para emular soluciones portátiles).

Sin embargo, zsh tiene muchas (muchas) extensiones que facilitan el trabajo interactivo. Esa es al mismo tiempo una excelente razón para cambiar y un problema:

  1. Pro zsh

    • Es muy bueno poder ver las opciones de sintaxis de comandos presionando una pestaña.
    • Otro beneficio importante de zsh es la corrección de errores cuando haces un error tipográfico. En lugar de solo mostrar error: comando no encontrado, zsh intentará interpretar lo que intentó escribir. zsh aceptará esta entrada como un comando válido.
    • Además, zsh tiene muchos modificadores de expansiones que permiten una amplia gama de soluciones. Me gusta: lista solo archivos: ls *(.)(lo cual es difícil con otros shells). Incluso si al mirar lo suficientemente profundo la respuesta también se vuelve compleja en zsh ( print -rl -- *(/)) .
    • Acepte las matemáticas con carrozas (con algunas advertencias).
  2. Con zsh:

    • Bash es el shell predeterminado en muchos más sistemas.
    • Muchas opciones de zsh no ayudan directamente a escribir scripts compatibles con bash.
    • Incluso podría convertirse en un gran problema al tratar de aprender dos proyectiles al mismo tiempo.

Al final, es su elección, y siempre me gustan más opciones.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.