Je cherche à passer de bash à zsh mais je m'inquiète de la compatibilité des scripts bash.
Tous les scripts / fonctions bash sont-ils compatibles avec zsh? Par conséquent, si cela est vrai, zsh est-il simplement une amélioration de bash?
Je cherche à passer de bash à zsh mais je m'inquiète de la compatibilité des scripts bash.
Tous les scripts / fonctions bash sont-ils compatibles avec zsh? Par conséquent, si cela est vrai, zsh est-il simplement une amélioration de bash?
Réponses:
Si vos scripts commencent par la ligne, #!/bin/bash
ils seront toujours exécutés avec bash, même si votre shell par défaut est zsh.
J'ai trouvé la syntaxe de zsh très proche de celle de bash, et je n'ai pas fait attention s'il y avait vraiment des incompatibilités. J'ai basculé il y a 6 ans de bash à zsh de manière transparente.
.zshrc
:)
#!/bin/bash
sera ignorée si vous exécutez le fichier script comme source ./script.sh
?
#!/usr/bin/env bash
plutôt l' utiliser , en particulier sur macOS, où le bash par défaut est gravement obsolète et où les nouvelles versions sont pratiquement toujours installées dans un chemin différent.
Zsh peut exécuter la plupart des scripts Bourne, POSIX ou ksh88 si vous le mettez dans le bon mode d'émulation ( emulate sh
ou emulate ksh
). Il ne supporte pas toutes les fonctionnalités de bash ou ksh93. Zsh a la plupart des fonctionnalités de bash, mais dans de nombreux cas avec une syntaxe différente.
Le shell que vous utilisez de manière interactive n’est pas pertinent pour tout script que vous avez. Le shell qui exécute les scripts est celui indiqué dans la première ligne, la ligne shebang . Par exemple, si le script commence par #!/bin/bash
, il sera exécuté par bash.
Si vous avez personnalisé bash, vous ne pourrez pas renommer simplement votre .bashrc
à .zshrc
. Certaines choses peuvent être partagées, par exemple des alias et des fonctions, tant que vous vous en tenez à l'intersection entre les deux shells (l'intersection est proche de ksh88 et de pdksh ). D'autres éléments, tels que les paramètres d'invite, les fonctions de complétion et la plupart des options, devront être complètement réécrits.
Si vous écrivez un extrait que les utilisateurs recherchent à partir de leur .bashrc
or .zshrc
et que vous ne souhaitez pas conserver deux versions, utilisez un sous-ensemble commun de fonctionnalités bash et zsh, qui inclut la plupart des fonctionnalités de programmation de bash. Mettez tout votre code dans des fonctions et placez la ligne suivante en haut de chaque fonction:
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
Vous pouvez utiliser emulate sh
au lieu de emulate ksh
vous rapprocher de la syntaxe simple sh, qui est ce dont vous avez besoin .profile
.
Si une fonction appelle une autre fonction, celle-ci hérite du paramètre émuler. Vous n'avez donc pas besoin d'insérer cette ligne dans les fonctions internes, mais uniquement dans les fonctions appelées par l'utilisateur final.
./my_script.sh
. source my_script.sh
et . my_script.sh
va l'exécuter est comme le shell actuel, en ignorant tout shebang.
Si le shebang est #!/bin/bash
et que vous démarrez le script, celui ./script
-ci sera exécuté par bash. Absolument aucun problème ici.
Cependant, si vous l'exécutez zsh ./script
ou . ./script
le sourcez dans l'instance zsh en cours d'exécution, il est assez courant que la syntaxe de bash et de zsh ne corresponde pas.
Par exemple, zsh ne divise pas les extensions de paramètres par défaut, bash a une aide intégrée, il n’existe pas read -p prompt
de zsh (la syntaxe est très différente de read 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 ^} `(premier caractère majuscule) dans zsh La liste est longue (surtout) de similitudes et de différences .
Dans certains cas, zsh peut être invité à imiter d'autres coquilles. Dans certains cas, il n’existe pas de syntaxe commune portable pour les deux shells (sans utiliser d’alias ou de fonctions pour émuler des solutions portables).
Cependant, zsh a beaucoup (beaucoup) d'extensions qui facilitent le travail interactif. C’est à la fois une excellente raison de passer et un problème:
ls *(.)
(ce qui est difficile avec d'autres shells). Même si en regardant assez profondément, la réponse devient aussi complexe dans zsh ( print -rl -- *(/)
) .Con zsh:
En fin de compte, c'est votre choix, et j'aime toujours plus de choix.