Du chaîne de commande shell page de la spécification POSIX:
Si la première ligne d'un fichier de commandes shell commence avec les caractères "#!", Les résultats sont non spécifiés.
Pourquoi le comportement de #!
non spécifié par POSIX? Je trouve qu'il se déconcerte que quelque chose de si portable et largement utilisé aurait un comportement non spécifié.
Je pense principalement parce que:
le comportement varie considérablement entre la mise en œuvre. Voir https://www.in-ulm.de/~mascheck/various/shebang/ Pour tous les détails.
Il pourrait toutefois maintenant spécifier un sous-ensemble minimum de la plupart des implémentations de type UNIX: comme #! *[^ ]+( +[^ ]+)?\n
(avec uniquement des caractères du caractère de nom de fichier portable défini dans ces un ou deux mots) où le premier mot est un chemin absolu de EXPUTABLE NATIVE, la chose n'est pas trop longue et le comportement non spécifié si l'exécutable est défini/setrgide et la mise en œuvre définissait si le chemin d'interprète ou le chemin de script est transmis comme argv[0]
à l'interprète.
POSIX ne spécifie pas de toute façon le chemin d'exécutable. Plusieurs systèmes ont des utilitaires pré-posix dans /bin
//usr/bin
et avoir les utilitaires POSIX ailleurs (comme sur Solaris 10 où /bin/sh
est une coquille de Bourne et le Posix One est en /usr/xpg4/bin
; Solaris 11 l'a remplacé par ksh93 qui est plus conforme à Posix, mais la plupart des autres outils de /bin
Sont toujours anciens non-posix). Certains systèmes ne sont pas des posix mais ont un mode/émulation POSIX. Tous les POSIX exigent qu'il existe un environnement documenté dans lequel un système se comporte de manière possize.
Voir Windows + Cygwin par exemple. En fait, avec Windows + Cygwin, la SHE-BANG est honorée lorsqu'un script est invoqué par une application Cygwin, mais pas par une application Windows natif.
Donc, même si POSIX spécifié le mécanisme Shebang, il n'a pas pu être utilisé pour écrire POSIX sh
/sed
/awk
... Scripts (Notez également que le mécanisme de Shebang ne peut pas être utilisé. écrire fiable sed
/awk
_ Script, car il ne permet pas de passer un marqueur de fin d'option).
Maintenant, le fait que c'est non spécifié ne signifie pas que vous ne pouvez pas l'utiliser (bien, il est dit que vous ne devriez pas avoir la première ligne de départ avec #!
Si vous vous attendez à ce que ce soit un commentaire régulier et non une she-bang), mais que POSIX ne vous donne aucune garantie si vous le faites.
Dans mon expérience, l'utilisation de Shebangs vous donne plus de garantie de portabilité que de l'utilisation de scripts de Shell de POSIX: laissez le script de SHE-BANG, écrivez le script dans POSIX sh
Syntaxe et espérez que tout ce qui appelle le script invoque un POSIX Conforme sh
sur celui-ci, qui va bien si vous savez que le script sera invoqué dans le bon environnement par le bon outil, mais pas autrement.
Vous devrez peut-être faire des choses comme:
#! /bin/sh -
if : ^ false; then : fine, POSIX system by default
else
# cover Solaris 10 or older. ": ^ false" returns false
# in the Bourne Shell as ^ is an alias for | there for
# compatibility with the Thomson Shell.
PATH=`getconf PATH`:$PATH; export PATH
exec /usr/xpg4/bin/sh - "$0" ${1+"$@"}
fi
# rest of script
Si vous souhaitez être portable vers Windows + Cygwin, vous devrez peut-être nommer votre fichier avec un .bat
ou .ps1
extension et utilisez un tour similaire pour cmd.exe
ou powershell.exe
Pour appeler le cygwin sh
sur le même fichier.