Commentaires
- Il sagit vraiment de la portabilité que vous souhaitez . Seuls les Unix? Toutes les boîtes basées sur le noyau Linux? Tous les systèmes, même vieux Win 3.0 et VMS (je plaisante)?
/bin/sh
est généralement un bon minimum, sachez simplement quesh
nest pasbash
.. . expect sur la plupart des systèmes GNU / Linux . - Bien quAndroid utilise le noyau linux et que le shell par défaut soit dérivé de bash via ash, le userland nest pas très semblable à unix et manquant de nombreux outils standard.
Réponse
Pour la portabilité, vous pouvez supposer en toute sécurité que #!/bin/sh
trouvera un shell principalement compatible POSIX sur nimporte quel système Unix ou Linux standard, mais cest vraiment à peu près tout.
Dans FreeBSD, OpenBSD et NetBSD ( avec DragonFly, PC-BSD et quelques autres dérivés), bash est situé à /usr/local/bin/bash
(sil est installé), donc le /usr/bin/env
Lapproche offre la portabilité entre Linux et BSD.
Android nest pas un système Unix ou Linux standard. Sur mon téléphone Android non rooté, aucun des /usr/bin/env
, /bin/bash
o r même /bin/sh
existe, et le shell système est /system/bin/sh
.
Un script shell qui manque le #!
(shebang) tentera de sexécuter dans le shell qui la appelé sur certains systèmes, ou utilisera un interpréteur par défaut différent (/bin/bash
par exemple) , sur dautres systèmes. Et bien que cela puisse fonctionner sous Android, il n’est pas garanti de fonctionner dans d’autres systèmes d’exploitation, où les utilisateurs peuvent choisir d’utiliser un shell interactif autre que bash
. (Jutilise tcsh dans FreeBSD, où cest le shell par défaut, et les scripts sans shebang sont interprétés par le shell appelant.)
Donc, doù je suis assis, on dirait que est impossible de créer un script shell portable entre les systèmes Android et non Android (Linux ou Unix), car Android fait les choses différemment.
Commentaires
- Daprès mon expérience,
/bin/sh
est censé pointer vers quelque chose qui ressemble plus àbsh
oudash
quebash
, qui est relativement gonflé et donc préféré pour une utilisation interactive. - Quelques erreurs ici. Il y en a encore beaucoup (principalement commerciales) Unices ici (la plupart dentre eux Solaris 10 et avant) où
/bin/sh
est le Shel Bourne l, pas un shell POSIX, POSIX ne ' t spécifier le chemin desh
. La plupart des shells (etexecp
/env
/find -exec...
) interpréteront un she-bang- moins de script avec le système ' ssh
, peu linterprètent avec eux-mêmes et quand ils le font, ils le font en mode de compatibilité POSIX. Cette ' est la manière standard / POSIX dexécuter un script, mais cela suppose que lappelant est dans un environnement POSIX . - Concernant * BSD
bash
est facultatif. Cela signifie quil y a de bonnes chances que même/usr/local/bin/bash
nexiste pas sur les systèmes (sans parler des systèmes propriétaires comme Solaris, AIX ou HP-Ux). - @ StephaneChazelas – re POSIX, je suis bien sûr daccord, et que ' s pourquoi les mots que jai utilisés étaient " principalement conformes à POSIX ". Mais cette question portait sur la portabilité, plutôt que sur l’endroit où trouver POSIX, et on ne peut ' t compter sur un shell toujours trouvé à un endroit. Concernant linterpréteur par défaut, un script sans shebang exécuté dans tcsh est interprété par tcsh sur FreeBSD. De toute évidence, il y a ' incohérence là aussi, donc jai ' mis à jour la réponse en conséquence.
- @Ouki – oui bien sûr, je nai ' pas pensé que cétait pertinent par rapport à la question. Mais jai ' ajouté cette clarification à la réponse pour plus de clarté.
Réponse
Daprès mon expérience, #!/bin/sh
et #!/bin/bash
ont toujours fini par trouver le bon environnement sur les quelques systèmes sur lesquels jai travaillé . Je nai pas encore rencontré dexception. Je trouve également quil est utilisé régulièrement dans les textes liés aux scripts shell qui, je suppose, sont écrits en gardant à lesprit la portabilité en raison de la diversité du public.
Je ne peux pas en dire autant avec #!/usr/bin/env
.Certains systèmes lont installé en tant que #!/bin/env
et ont cassé mes scripts python dans le passé. Donc, je vais aller avec la deuxième puce.
Voici quelques explications pour ma déclaration ci-dessus:
Sur la version 5.7 de CentOS, jobtiens ce qui suit:
$ which env /bin/env
Sur Ubuntu 12.04 Precise Pangolin:
$ which env /usr/bin/env
De plus, au moins dans un ancien système, je me souviens des administrateurs installé coreutils
sur /opt
pour une raison quelconque (peut ne pas être une bonne pratique). Depuis env
fait partie de coreutils
, les utilisateurs ont fini par lobtenir à /opt/coreutils/bin/env
. Certes, je nai pas utilisé tous les systèmes, donc la réponse est basé sur mon expérience limitée.
/bin/bash
nest certainement pas FreeBSD (serait be/usr/local/bin/bash
car bash ne fait pas partie des shells par défaut)./usr/bin/env
(SCO qui est barel y existant, NextStep qui est pratiquement éteint – plus bien sûr les systèmes non-Unix les plus courants tels quAndroid ou Windows). Dun autre côté,/bin/bash
nexiste quasiment que sur Linux non embarqué./bin/sh
est une valeur sûre sur nimporte quel unix, mais quelques anciens systèmes ont un shell Bourne non POSIX.which env
isn ' t pertinent: il existe un certain nombre de systèmes où/usr/bin
est un lien symbolique vers/bin
ou vice versa, ce qui rend les deux/usr/bin/env
et/bin/env
utilisables. Ce qui compte, cest que/usr/bin/env
soit présent, ce qui est le cas sur toutes les distributions Linux que jai ' jamais vues ou entendues (et en les supprimant briserait tellement de choses que personne ne le ferait).