Question Qu'est-ce qui est en danger avec le passage à la ZSH?


La plupart des conseils pour Mac sont écrits en supposant que vous utilisez le shell Bash. Si je passe à zsh, à quel point est-ce que je suis incompatible avec les scripts Bash actuels que j'ai sur mon système, et les conseils que les utilisateurs de SU me donnent?

Est-ce que le #!/bin/sh ligne au début de mes scripts aide?

Modifier: Non pertinent à la question est pourquoi je veux le faire. Meilleur achèvement de tabulation. Je viens d'essayer zsh en mettant un script de connexion comme suggéré ici et je suis absolument époustouflé.


4
2018-05-16 23:42


origine




Réponses:


La ligne de shebang que vous affichez signifie exécuter le script en utilisant le shell Bourne (ou un autre shell en mode de compatibilité). Ces scripts continueront probablement à s'exécuter en utilisant le même shell qu'ils sont maintenant si vous passez à zsh en tant que shell interactif. La seule façon de changer est si vous liez sh à zsh, mais cela ne devrait pas changer la fonctionnalité.

Vous trouverez une certaine compatibilité entre zsh et Bash lorsqu'il est utilisé comme shell de connexion ou lorsque vous écrivez des scripts en appelant l'un ou l'autre en utilisant des lignes de shebang telles que:

#!/usr/bin/bash

ou

#!/usr/bin/zsh

Cependant, il y a beaucoup de choses que zsh fait différemment ou que Bash ne peut pas faire du tout. Bash est beaucoup plus utilisé, donc moins de gens connaissent les subtilités de zsh. Les informations à ce sujet sont largement disponibles, cependant. De plus, vous constaterez qu’une aide plus que suffisante est disponible ici.

Vous constaterez que pour écrire des scripts, le shell est considérablement plus puissant que le shell Bourne (sh), mais au détriment de la portabilité. De plus, Bash étant plus utilisé que zsh, ses scripts sont relativement plus portables.


4
2018-05-16 23:58



Merci pour ça. Vous dites "l'une ou l'autre coquille est considérablement plus puissante que la coquille Bourne." Vous voulez dire bashou zsh comme vous le montrer dans la ligne de shebang? - Dan Rosenstark
@Yar: Oui, Bash et Zsh (et même le shell Korn, en particulier Ksh93) ont plus de capacités que sh. - Dennis Williamson
Bon, presque tous les scripts shell sont écrits pour le mode compatibilité. Je n'en avais aucune idée. Pendant ce temps ma ligne de shebang dit #!/usr/bin/env ruby la plupart du temps, mais j'utilise beaucoup d'autres personnes sh scripts. - Dan Rosenstark


Je ne suis pas un utilisateur zsh, mais d'après ce que j'ai lu sur SuperUser et ailleurs, j'ai toujours eu l'impression que ses fans se concentrent davantage sur ses fonctionnalités supplémentaires pour une utilisation interactive que pour les scripts. La première phrase de la description de zsh sur le Site ZSH, souligne cet accent sur les fonctions interactives: "Zsh est un shell conçu pour une utilisation interactive, bien qu’il s’agisse également d’un langage de script puissant."

Cela dit, si vous prévoyez de changer de shell de connexion, vous pouvez continuer à écrire vos scripts en bash. Comme une autre réponse l'a souligné, les scripts bash seront plus portables.

Scripts existants avec les explicites #!/bin/sh (ou #!/bin/bash ou tout autre chemin) continuera à fonctionner sans tenir compte de votre shell de connexion.


4
2018-05-17 03:04



Quand j'écris des scripts tout seul, j'utilise Ruby :) bonne réponse, merci! - Dan Rosenstark
L'utilisation de zsh est incroyablement pratique. Le script, pas du tout. btw, zsh agit différemment selon comment vous l'appelez, c.-à-d. si / bin / sh est un lien symbolique vers / bin / zsh, alors zsh agira plus comme / bin / sh - chiggsy


Ici vous trouverez une liste de "basismes", c’est-à-dire des morceaux de code qui fonctionneront dans le shell bash mais pas dans d’autres shells compatibles.

Si vous souhaitez obtenir une portabilité maximale lors de l'écriture de scripts shell, lancez votre script avec #!/bin/sh et éviter les "bashismes", de sorte qu'il s'exécute dans tout autre shell compatible avec Posix, comme ksh ou zsh.


3
2018-05-17 04:48



Merci, bonne information lorsqu'il est ajouté aux autres réponses. - Dan Rosenstark


/bin/sh pointe vers bash, en l'exécutant en mode compatibilité. La seule chose qui change vos modifications de shell de connexion est de savoir quels composants sont disponibles et comment ils fonctionnent. Les scripts suivent leur ligne de shebang.


1
2018-05-16 23:54



Il convient de noter que cela est vrai sur certains systèmes. Sur d'autres, il est lié à dashou ash ou d'autres, ou même en réalité, c'est la vraie affaire Bourne. - Dennis Williamson
Ouaip. Mais la question est marquée "osx". - Ignacio Vazquez-Abrams
Malheureusement, "noté" est trop petit pour être un commentaire sur SU. - Dan Rosenstark


Par "passer à zsh", je suppose que vous voulez dire l'une des deux choses suivantes:

  • vous utiliserez chsh (ou équivalent) pour changer votre shell de connexion en zsh, ou
  • vous allez configurer Terminal (ou équivalent) à utiliser zsh comme shell par défaut.

La plupart des programmes shell (shell "scripts") comprendront un "Shebang" / "hash-bang" ligne. Le shebang déclare quel interpréteur (shell) doit interpréter (exécuter) le programme qui le suit.

Comme plusieurs autres réponses l'indiquent, les programmes shell qui utilisent une ligne shebang ne seront pas affectés par la sélection du shell de connexion par l'utilisateur, ni par le shell interactif qui est le parent ou le parent Nth d'un programme shell lancé.

Si vous installez une nouvelle version de zsh et l'inclure dans votre PATH, les programmes qui utilisent un shebang comme #!/usr/bin/env zsh utilisera cette nouvelle version (quand ils sont démarrés avec un PATH qui met le nouveau zsh premier). Cela ne peut causer des problèmes que si des modifications incompatibles ont été apportées entre votre ancienne version / version originale de zsh et le nouveau. Notez que ce serait un intra-zsh (entre-zsh-version) problème, pas le problème inter-shell sur lequel je pense que vous êtes concerné. Il s’agit généralement d’une catégorie d’erreur beaucoup plus petite que si (par exemple) vous tentiez frapper programme avec ksh.

Ne pas utiliser une ligne shebang n'est pas portable entre les environnements utilisateur. Le résultat d'essayer d'exécuter un exécutable, non binaire fichier dépourvu de shebang dépend de l'environnement (système d'exploitation, shell, éventuellement shell de connexion et variables d'environnement). Lorsqu'un tel fichier est exécuté sur mon système Mac OS X 10.4, le comportement varie en fonction du shell qui l'exécute. ksh, et frapper les deux interprètent le fichier dans une copie fourchue d'eux-mêmes. zsh passe toujours à /bin/sh. Si un programme devait essayer de exec directement, il échouerait avec ENOEXEC (cela se produit à l'intérieur du shell, ils le "couvrent" en le "exécutant" d'une manière alternative). J'ai un vague souvenir de certains systèmes anciens qui essayaient même d'utiliser le shell de connexion de l'utilisateur dans cette situation, mais ma recherche rapide n'a rien révélé d'utile.

 Un fichier non binaire est un fichier que le noyau ne reconnaît pas comme l'un de ses formats d'objet binaire pris en charge.


En ce qui concerne la compatibilité interactive, zsh prend en charge une grande partie de la syntaxe étendue de frapper et ksh (une partie de if doit être activée avec les options shell, cependant), une grande partie du conseil "shell" que vous trouvez sur Super User fonctionnera très bien dans zsh (même si certains sont composés de "bashismes"). Quelques choses (liaisons d'édition en ligne de commande, achèvement, affichages rapides, etc.) sont totalement différents de frapper et ksh et nécessitera une syntaxe différente pour des opérations similaires.

  zsh a un peu de frapper compatibilité complète, mais je ne l'ai jamais essayé.


1
2018-05-17 09:00



Toujours en train de le traiter. +1 pour l'instant :) - Dan Rosenstark
Cela fonctionne mieux (le complément de bash de zsh) que bash. - chiggsy