en-tête de script shell pour une meilleure compatibilité [duplicate]

Cette question a déjà des réponses ici :

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 que sh nest pas bash .. . 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 ou dash que bash, 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 de sh. La plupart des shells (et execp / env / find -exec...) interpréteront un she-bang- moins de script avec le système ' s sh, 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.

Commentaires

  • Par exemple /bin/bash nest certainement pas FreeBSD (serait be /usr/local/bin/bash car bash ne fait pas partie des shells par défaut).
  • Il ' est plutôt le contraire: seulement certains systèmes très rares manquent de /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.
  • @Gilles Merci pour linfo. Jai mis à jour ma réponse en fournissant des preuves de ce que jai vu sur certains systèmes que jai rencontrés.
  • 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).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *