Estoy buscando cambiar de bash a zsh pero me preocupa la compatibilidad de los scripts de bash.
¿Todos los scripts / funciones bash son compatibles con zsh? Por lo tanto, si eso es cierto, ¿zsh es solo una mejora para bash?
Estoy buscando cambiar de bash a zsh pero me preocupa la compatibilidad de los scripts de bash.
¿Todos los scripts / funciones bash son compatibles con zsh? Por lo tanto, si eso es cierto, ¿zsh es solo una mejora para bash?
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.
.zshrc
:)
#!/bin/bash
se ignorará si se ejecuta el archivo de secuencia de comandos como source ./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
o 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 .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:
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
Puede usar en emulate sh
lugar de emulate 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.
./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,
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:
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.