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

64

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?

chrisjlee
la source
J'ai trouvé cela utile: askubuntu.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

Réponses:

57

Si vos scripts commencent par la ligne, #!/bin/bashils 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.

Huygens
la source
1
Quelle a été la partie la plus difficile de votre passage?
chrisjlee
4
Aucun. Mes scripts personnels ajoutent la référence appropriée à bash et j'avais trouvé un bon .zshrc pour commencer. Zsh et bash étaient assez similaires pour que je ne trouve pas ça difficile.
Huygens
4
pouvez-vous lister votre .zshrc:)
neaumusic
1
Mais si la ligne #!/bin/bashsera ignorée si vous exécutez le fichier script comme source ./script.sh?
LCB
3
Coder en dur le chemin d'accès au shell est un mauvais conseil, même s'il est fait fréquemment. Vous devriez #!/usr/bin/env bashplutô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.
Konrad Rudolph le
29

Zsh peut exécuter la plupart des scripts Bourne, POSIX ou ksh88 si vous le mettez dans le bon mode d'émulation ( emulate shou 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 .bashrcor .zshrcet 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 shau lieu de emulate kshvous 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.

Gilles, arrête de faire le mal
la source
1
Le shell que vous utilisez n’a aucune importance si vous exécutez vos scripts en tant que ./my_script.sh. source my_script.shet . my_script.shva l'exécuter est comme le shell actuel, en ignorant tout shebang.
BallpointBen
3

Si le shebang est #!/bin/bashet 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 ./scriptou . ./scriptle 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 promptde 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:

  1. Pro zsh

    • Il 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'erreur lorsque vous faites une faute de frappe. Plutôt que simplement afficher une erreur: commande non trouvée, zsh essaiera d'interpréter ce que vous avez essayé de taper. zsh acceptera cette entrée comme une commande valide.
    • En outre, zsh dispose de nombreux modificateurs d’expansion permettant une large gamme de solutions. J'aime: ne lister que les fichiers: 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 -- *(/)) .
    • Acceptez les mathématiques avec des flotteurs (avec quelques réserves).
  2. Con zsh:

    • Bash est le shell par défaut dans beaucoup plus de systèmes.
    • Beaucoup d'options zsh n'aident pas directement à écrire des scripts compatibles bash.
    • Cela pourrait même devenir un gros problème d'essayer d'apprendre deux coquillages en même temps.

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

Isaac
la source