Quelqu'un m'envoie un script aujourd'hui commençant par #: et après googling je n'ai trouvé aucune réponse.Différence entre #!/Bin/sh et #:/bin/sh
Même si le script fonctionne, je me demande ce que cela signifie.
Quelqu'un m'envoie un script aujourd'hui commençant par #: et après googling je n'ai trouvé aucune réponse.Différence entre #!/Bin/sh et #:/bin/sh
Même si le script fonctionne, je me demande ce que cela signifie.
Wow! Cela ramène beaucoup de souvenirs! Dans les années 1980 et au début des années 1990, il y avait deux coques de base, Bourne shell (/bin/sh
) et C shell (/bin/csh
).
Bourne shell avait très peu de choses conviviales. Il n'y avait pas d'alias ou de substitutions de commandes. Par conséquent, la plupart des gens ont aimé utiliser C Shell comme shell par défaut.
Cependant, Csh était un langage de script terrible. (Voir http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/). Par conséquent, vous avez utilisé C shell comme shell, mais vous avez écrit vos scripts dans Bourne shell qui avait une syntaxe bien meilleure. Cependant, il y avait un minuscule petit problème: Puisque votre shell par défaut est C Shell, en tapant un nom de script shell sur la ligne de commande, le C Shell le ramasserait et essaierait de l'exécuter.
Pour contourner cela, vous mettez :
comme première ligne de votre programme. C'était un commentaire Bourne shell, mais une commande Shell C invalide. Ainsi, le script ne fonctionnera pas si vous avez oublié de mettre sh
devant. Plus tard, les systèmes sauraient si la première ligne était :
, ce devrait être un script shell Bourne. Et, même plus tard, vous pouvez mettre #:
donc ce serait un commentaire et non une commande. Certaines personnes placent le nom du shell, /bin/sh
à côté pour aider à rappeler aux gens qu'ils étaient supposés exécuter ce script sous la forme d'un shell Bourne.
C shell a commencé à s'éteindre après que Kornshell a commencé à devenir populaire. C'était à peu près à ce moment que le shebang (#!
) est sorti, mais c'était seulement pour AT & T et pas les systèmes dérivés de Berkeley. Les systèmes BSD n'ont pas obtenu le shebang avant la fin des années 1980. Et, les gens de Sun ont utilisé C Shell comme shell par défaut jusqu'à la sortie de Solaris.
Je n'avais pas vu un programme commencer par #: /bin/sh
dans les âges.
BTW, il est courant de commencer vos scripts ainsi:
#! /usr/bin/env perl
De cette façon, vous utilisez la version de Perl qui est dans votre chemin et ne pas se soucier quel répertoire il se trouve.Par exemple, si vous commencez votre script avec:
#! /usr/local/bin/perl
Et, Perl est en fait dans /usr/bin
, votre script ne fonctionnera pas. Le programme env
est toujours dans /usr/bin
et est garanti pour fonctionner. Bien sûr, si vous voulez utiliser une version spécifique de Perl et non celle du chemin, vous utiliserez la première méthode.
Il y a [certains systèmes bizarres] (http://en.wikipedia.org/wiki/Shebang_ (Unix) qui ont 'env' ailleurs, je crois .. –
Merci beaucoup pour cette réponse complète pertinente! – Vlagorce
@Dennis: Je ne savais certainement pas qu'il y avait des systèmes avec/bin/env au lieu de/usr/bin/env, ce qui rend les choses plus compliquées, mais les deux systèmes mentionnés étaient OpenServer de SCO et Cray UNICO (ou quelque chose comme ça). Je n'ai pas vu de Cray depuis des années, et je ne pense pas que SCO sera là beaucoup plus longtemps Ok,/usr/bin/env n'est pas universel, mais c'est vraiment très proche. –
Ceci est un commentaire que ...
#:/bin/sh
un tralala est # !. Tout le reste commençant par un # est un commentaire.
exemple:
exécuter un script commençant par
#!/usr/bin/perl
et il sera géré par Perl. Maintenant, remplacez le '!' par ':' et vous l'exécuterez avec l'interpréteur defaut, qui est votre shell.
Complètement correct. Juste une petite note. Un espace est préféré après le '#!' Pour des raisons historiques. –
@Diego: Je crois que ces raisons historiques se rapportent à ces systèmes obscurs et obsolescents que de nos jours, plus personne n'utilise l'espace. –
Vous pouvez également faire "#!/Usr/bin/env perl". De cette façon, le script fonctionnera tant que "perl" est dans votre variable d'environnement $ PATH. J'ai eu des systèmes avec Perl dans/bin,/usr/bin /, ou/usr/local/bin. Il est difficile de tester un script sur un système et d'en faire échouer un autre parce que vous mettez "#!/Bin/perl" dans votre script, mais dans "/ usr/local/bin/perl" sur l'autre machine . –
Ce peut être une faute de frappe quand il ou elle faisait référence à '#!' ... –