web-dev-qa-db-fra.com

Tous les scripts bash sont-ils compatibles avec `zsh`?

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?

75
chrisjlee

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.

60
Huygens

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:

  1. Pro zsh

    • C'est très agréable de pouvoir voir les options de syntaxe de commande en appuyant sur un onglet.
    • Un autre avantage majeur de zsh est la correction d'erreurs lorsque vous faites une faute de frappe. Plutôt que de simplement afficher l'erreur: commande introuvable, zsh essaiera d'interpréter ce que vous avez essayé de taper. zsh acceptera cette entrée comme une commande valide.
    • De plus, zsh possède de nombreux modificateurs aux extensions qui permettent une large gamme de solutions. Comme: lister uniquement les fichiers: 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 -- *(/)) .
    • Acceptez les mathématiques avec des flotteurs (avec quelques mises en garde).
  2. Con zsh:

    • Bash est le Shell par défaut dans de nombreux autres systèmes.
    • De nombreuses options zsh ne permettent pas directement d'écrire des scripts compatibles bash.
    • Cela pourrait même devenir un gros problème en essayant d'apprendre deux obus en même temps.

En fin de compte, c'est votre choix et j'aime toujours plus de choix.

6
Isaac