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.
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.
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:
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.
Respuestas:
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.
fuente
.zshrc
:)#!/bin/bash
se ignorará si se ejecuta el archivo de secuencia de comandos comosource ./script.sh
?#!/usr/bin/env bash
lugar, 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.Zsh puede ejecutar la mayoría de los scripts Bourne, POSIX o ksh88 si lo coloca en el modo de emulación correcto (
emulate sh
oemulate 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
.bashrc
a.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
.bashrc
o.zshrc
y 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:Puede usar en
emulate sh
lugar deemulate ksh
estar 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.
fuente
./my_script.sh
.source my_script.sh
y. my_script.sh
lo ejecutará como el shell actual, ignorando cualquier shebang.Si el shebang es
#!/bin/bash
y comienzas el script,./script
bash ejecutará el script. Absolutamente no hay problema aquí.Sin embargo, si lo ejecuta
zsh ./script
o lo. ./script
genera 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 prompt
en zsh (la sintaxis es muy diferente, lea cmd \? Prompt, arrays start on 1 (not 0) in zsh,
commandonly 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:
Pro zsh
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 -- *(/)
) .Con zsh:
Al final, es su elección, y siempre me gustan más opciones.
fuente