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.)
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:
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).
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!
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 bash
by 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 .
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:
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.