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 n'est-il qu'une amélioration de bash?
Si vos scripts commencent par la ligne #!/bin/bash
ils seront toujours exécutés en utilisant 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. Il y a 6 ans, je suis passé de bash à zsh de manière transparente.
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 prend pas en charge 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.
L'interpréteur de commandes interactif que vous utilisez n'est pas pertinent pour tout script dont vous disposez. 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 simplement renommer votre .bashrc
à .zshrc
. Certaines choses peuvent être partagées, par exemple les alias et les fonctions, tant que vous vous en tenez à l'intersection entre les deux shells (l'intersection est proche de ksh88 et pdksh ). D'autres éléments, tels que les paramètres d'invite, les fonctions d'achèvement et la plupart des options, devront être entièrement réécrits.
Si vous rédigez un extrait pour que les internautes puissent s'approvisionner à partir de leur .bashrc
ou .zshrc
et vous ne voulez pas conserver deux versions, respectez 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 les 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
pour être plus proche de la simple syntaxe sh, ce dont vous avez besoin pour .profile
.
Si une fonction appelle une autre fonction, l'autre fonction hérite du paramètre d'émulation, vous n'avez donc pas besoin de mettre cette ligne dans les fonctions internes, uniquement dans les fonctions appelées par l'utilisateur final.
Si le Shebang est #!/bin/bash
Et que vous démarrez le script comme ./script
, Le script sera exécuté par bash. Absolument aucun problème ici.
Cependant, si vous exécutez zsh ./script
Ou le sourcez . ./script
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'y a pas read -p Prompt
Dans zsh (la syntaxe est très différente lire cmd \? Prompt, arrays start on 1 (not 0) in zsh,
commandeonly search for external commands in zsh, or there is no (simple) equivalent to
$ {foo ^} `(majuscule uniquement le premier caractère) dans zsh, entre autres. Ceci est une longue liste de (principalement) similitudes et quelques différences .
Dans certains cas, il peut être demandé à zsh d'émuler d'autres shells. Dans certains cas, il n'y a pas de syntaxe portable commune aux deux shells possible (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 basculer 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 également complexe dans zsh (print -rl -- *(/)
) .Con zsh:
En fin de compte, c'est votre choix et j'aime toujours plus de choix.