web-dev-qa-db-fra.com

Est-il recommandé d'utiliser ZSH au lieu de scripts Bash?

Puis-je supposer que suffisamment de personnes ont zsh installé pour exécuter des scripts avec un

#!/usr/bin/env zsh

comme shebang?

Ou cela fera-t-il faire mes scripts non runnable sur trop de systèmes?

Clarification: Je suis intéressé par des programmes/scripts Un utilisateur final peut vouloir exécuter (comme sur Ubuntu, Debian, Suse, Arch & C.)

27
Profpatsch

Pour la portabilité, non. Tandis que zsh peut être compilé sur n'importe quel Windows Unix ou Unix et même de Windows via Cygwin, et est emballé pour la plupart des goûts d'unix open source et plusieurs commerciaux, il n'est généralement pas inclus dans l'installation par défaut.

bash sur l'autre extrémité est installé sur GNU systèmes (comme bash est la coque du projet GNU) comme la grande majorité des non-majobuments de Systèmes basés sur Linux intégrés et parfois sur des systèmes non-GNU tels que Apple OS/x. Au niveau commercial Unix, la coquille de Korn (la variante AT & T, bien que davantage le ksh88 1) est la norme et les deux bash et zsh sont dans des packages en option. Sur les BSDS, la coque interactive préférée est souvent tcsh tandis que sh est basé sur la coquille d'almquiste ou pdksh et bash ou zsh Il faut également installer des packages en option.

zsh est installé par défaut sur Apple _ os/x. Il était même utilisé pour être le /bin/sh Là. Il peut être trouvé par défaut dans quelques distributions Linux tels que Sysresccd, GRML, Gobolinux et probablement d'autres, mais je ne pense pas aux majeurs.

Comme pour bash, il y a la question de la version installée et, par conséquent, les fonctionnalités disponibles. Par exemple, il n'est pas rare de trouver des systèmes avec bash3 Ou zsh3. En outre, rien ne garantit que le script que vous écrivez maintenant pour zsh5 Fonctionnera avec zsh6, Bien que comme pour bash, ils essaient de maintenir la compatibilité en arrière.

Pour les scripts, ma vue est: Utilisez la syntaxe de la coque POSIX, car tous les unes ont au moins une coque appelée sh (pas nécessairement dans /bin) Qui est capable d'interpréter cette syntaxe. Ensuite, vous n'avez pas à vous soucier de la portabilité. Et si cette syntaxe n'est pas suffisante pour votre besoin, vous avez probablement besoin de plus d'une coquille.

Ensuite, vos options sont:

  • Perl qui est omniprésent (bien que vous puissiez encore avoir à vous limiter à la fonction d'anciennes versions et que vous ne pouvez pas faire des hypothèses sur les modules PERL installés par défaut)
  • Spécifiez l'interprète et sa version (Python 2.6 ou supérieur, ZSH 4 ou supérieur, Bash 4.2 ou supérieur ...), en tant que dépendance pour votre script, soit en construisant un package pour chaque système ciblé qui spécifie la dépendance ou en le stipulant Dans un fichier README Expédié à côté de votre script ou intégré comme des commentaires en haut de votre script ou en ajoutant quelques lignes à Bourne Syntax au début de votre script qui vérifie la disponibilité de l'interpréteur demandé et Bails avec une erreur explicite quand ce n'est pas, comme -ce script a besoin de ZSH 4.0 ou plus.
  • Expédiez l'interprète à côté de votre script (méfiez-vous des implications de licence), ce qui signifie que vous avez également besoin d'un package pour chaque système d'exploitation ciblé. Certains interprètes facilitent la tâche en fournissant un moyen d'emballer le script et son interprète dans un seul exécutable.
  • Écrivez-le dans une langue compilée. Encore une fois, un paquet par système ciblé.
29
Stéphane Chazelas

Non tu ne peux pas. Ce qui est garanti disponible est /bin/sh, essentiellement la coquille originale de Bourne. Presque tous (notez les installations "presque"!) Linux auront bash, mais sur * BSD Systems, il est rare (la perspective BSD a de graves inquiétudes sur le code GPL, comme Bash). Je ne sais pas ce que la coque standard est sur Mac, mais encore une fois, il y a des inquiétudes sur GPL. Idem pour Solaris.

zSH est une coquille de niche, ce n'est pas dans l'installation par défaut de Fedora (et je ne crois pas que ce soit défaut pour tout distributeur majeur).

9
vonbrand

Je pense que cela dépend vraiment de quoi zsh Les fonctionnalités supplémentaires que vous utilisez et où. Si vous envisagez de distribuer votre script sur les différents utilisateurs et systèmes, je suggérerais d'utiliser bash ou même SH .

La même période si votre script conçu pour être exécuté sur votre organisation et que vous avez une convention pour avoir ZSH sur vos machines (par exemple, la même AMI de base) et Votre tâche a des avantages clairs des extensions telles que les sélecteurs de fichiers avancés ou d'autres choses à partir de http://www.rayninfo.co.uk/tips/zshtips.html Je dirais partir!

2
A B

Comme indiqué, bash est couramment disponible dans l'installation par défaut pour de nombreuses distributions. Votre script n'atteint pas la plus grande base d'utilisateurs en s'appuyant sur zsh.

Une question importante à répondre avant de concevoir votre script est " Pourquoi est-ce important que Shell Un script est exécuté? "

Différentes obus utilisent une syntaxe différente ou offrent des fonctions de shell supplémentaires qui peuvent ne pas être prises en charge par d'autres coquilles. Pour écrire un script pour le "World General Linux End World", déterminez si votre script utilise des fonctions Syntaxe ou Shell qui s'appuient sur un environnement shell particulier.

Par exemple, bash shell prend en charge certaines extensions qui ne sont pas prises en charge par dash, shell de Bourne, ou quoi que ce soit /bin/sh pointe sur le système de l'utilisateur.

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

Essayez d'exécuter echo {1..10} avec /bin/sh par rapport à /bin/bash Et vous obtiendrez une sortie très différente.

Il en va de même pour zsh qui, tout en soutenant la plupart des syntaxes bash, offre une expansion et une syntaxe supplémentaires non prises en charge par la coquille bash. Voir ceci Tables comparant des coquilles pour des exemples spécifiques.

Vous pouvez élargir votre base d'utilisateurs potentielle au-delà de bashby adhérant aux scripts qui fonctionnent quand appelé avec #!/bin/sh -u. Cependant, cela donne lieu à une autre question importante à demander: " Qu'est-ce qui est sacrifié en échange d'une plus grande portabilité? "

Déterminez si les différences relatives aux préoccupations de sécurité, aux fonctionnalités, à l'efficacité ou à toute autre chose que vous ressentez est une priorité pour votre script en vaudra le sacrifice. Vous ne voudrez peut-être pas utiliser une large cuve d'un script avec une vulnérabilité de sécurité connue simplement parce que cela fonctionne dans plus d'environnements.

Tant de scripts sont écrits pour bash que la prise en charge de ces scripts est utilisée comme critère lorsque comparer des coquilles de commande . Beaucoup d'autres personnes seront en mesure d'exécuter votre script que s'il s'appuie sur zsh ou toute autre syntaxe exclusive à un environnement Shell.

Aussi, gardez à l'esprit que vous n'avez pas finalement contrôler la manière dont l'utilisateur exécute le script (également utile pour scripts de débogage dans différentes coquilles ):

N'oubliez pas que si vous utilisez une coquille pour lire un script shell ("Script nom"), au lieu de l'exécuter directement ("./scriptName"), la Shell traitera toutes les commentaires au début du script Shell. En particulier, le commentaire qui spécifie l'interprète à utiliser lors de l'exécution du script ("#!/Bin/sh -u") sera ignoré, de même que toutes les options énumérées à côté de cet interprète.

Donc, le meilleur que vous puissiez faire à ce sujet est de rendre vos scripts portables, tant qu'il n'y a pas de grand sacrifice sur la manière dont il fonctionne.

Vous pouvez également voir Conventions de codage Bash - Overflow de pile .

1
iyrin

La seule chose que vous pouvez presque garantir est qu'il y ait un /bin/sh. Cela pourrait être une coque liée en réalité statique, ou peut être un lien vers un autre shell. Cet autre shell détecte généralement qu'elle s'appelle SH et fonctionnera en mode de compatibilité.

Notez le presque dans la première phrase.

Chaque système Unix comme si j'ai jamais travaillé. Beaucoup d'entre eux avaient également installé Bash (mais et non d'entre eux. Par exemple, Bash, il n'est pas installé par défaut sur certains BSD. Quelques navires de distribution Linux avec - [~ # ~] DASH [~ # ~ ~] , la coquille de Debian Almquist à la place.

Ce que vous pouvez garantir, ce sont vos instructions d'installation. Vous pouvez ajouter une ligne au README indiquant que c'est besoin de ZSH. Si vous construisez un package, vous pouvez marquer ZSH comme une dépendance. Vous pouvez le vérifier avec les outils AutoConf/Automake. Vous pouvez vérifier si ZSH est trouvé avec le script d'installation (commencez par/bin/sh et essayez de localiser ZSH, si vous êtes trouvé Continuer. Si vous n'ayez pas afficher une erreur. Par exemple, AVERTISSEMENT: ZSH n'est pas installé. Veuillez lire le fichier d'instructions d'installation! ".)

Je suis sûr que j'ai oublié quelques options supplémentaires. Mais les points clés sont:

  • Vous ne pouvez rien garantir jusqu'à ce que vous l'avez vérifié.
  • Vous êtes presque assuré que/bin/sh est présent et que vous pouvez faire une vérification avec cela.
1
Hennes

C'est une bonne question. J'ai une bibliothèque de scripts TCSH qui ont une utilisation générale. Toutefois, compte tenu de la réputation de TCSH .. Je dois les réécrire (sinon ils fonctionnent bien). Je pense que la réponse est assez simple: bash. Il a la base installée la plus large due à GNU/Linux.

0
Steve