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.
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.
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:
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.
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.
la source
.zshrc
:)#!/bin/bash
sera ignorée si vous exécutez le fichier script commesource ./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
ouemulate 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:Vous pouvez utiliser
emulate sh
au lieu deemulate 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.
la source
./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,
commandonly 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:
Pro zsh
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.
la source