Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[un peu HS] sha-bang

8 réponses
Avatar
steve
Bonjour,

Je suis en train d'expliquer les scripts sous *nix à un débutant. Je
dois donc passer par le début à savoir le sha-bang (#!) suivi du chemin
absolu de l'interpréteur de commande (/bin/sh par exemple). Je croyais que
cette première ligne était *obligatoire* pour que le script s'exécute.
Or le script suivant :

<début script>

echo "Ton nom ?"
read nom
echo "Ton nom est $nom"

<fin script>

fonctionne si je le lance par

1) sh script.sh et script.sh n'est pas exécutable

2) ./script.sh et script.sh est exécutable

Donc dans les deux cas sans le sha-bang initial.

Et là je suis embêté pour expliquer le pourquoi du comment.

Pourriez-vous éclairer ma lanterne ?

Merci d'avance

--
Steve

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

8 réponses

Avatar
Stephane Bortzmeyer
On Wed, Jul 02, 2008 at 09:12:45AM +0200,
steve wrote
a message of 41 lines which said:

Je croyais que cette première ligne était *obligatoire* pour que le
script s'exécute.



Non.

2) ./script.sh et script.sh est exécutable

Donc dans les deux cas sans le sha-bang initial.



/bin/sh est l'interpréteur par défaut.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
David Soulayrol
Le mercredi 02 juillet 2008 à 09:12 +0200, steve a écrit :
Bonjour,

Je suis en train d'expliquer les scripts sous *nix à un débutant. Je
dois donc passer par le début à savoir le sha-bang (#!) suivi du chemin
absolu de l'interpréteur de commande (/bin/sh par exemple). Je croyais que
cette première ligne était *obligatoire* pour que le script s'exécute.
Or le script suivant :

<début script>

echo "Ton nom ?"
read nom
echo "Ton nom est $nom"

<fin script>

fonctionne si je le lance par

1) sh script.sh et script.sh n'est pas exécutable

2) ./script.sh et script.sh est exécutable



Le script est simplement interprété par le shell qui le lance; sh dans
le premier cas, le shell courant dans le second cas. La ligne she-bang
permet d'indiquer le programme qui devrait être utilisé pour lire le
script. En son absence, le shell essaie tout seul.

Ici le script est un script shell. Écrit un petit bout de perl ou de
python, ou autre. Tu vas voir que si tu cherches à l'invoquer sans
she-bang, le shell va t'insulter copieusement.

Donc dans les deux cas sans le sha-bang initial.

Et là je suis embêté pour expliquer le pourquoi du comment.

Pourriez-vous éclairer ma lanterne ?

Merci d'avance



De rien.

--
David.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Stephane Bortzmeyer
On Wed, Jul 02, 2008 at 09:29:11AM +0200,
David Soulayrol wrote
a message of 53 lines which said:

le shell courant dans le second cas.



Inexact. C'est /bin/sh qui est appelé s'il n'y a pas de she-bang, pas
le shell courant.

Exemple, je suis en zsh :

% echo $ZSH_VERSION
4.3.6

Je mets cette même commande dans un script sans she-bang, je le lance
avec zsh, puis avec le shell par défaut :

% zsh monscript
4.3.6

% ./monscript

%

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
David Soulayrol
Le mercredi 02 juillet 2008 à 10:48 +0200, Stephane Bortzmeyer a écrit :
On Wed, Jul 02, 2008 at 09:29:11AM +0200,
David Soulayrol wrote
a message of 53 lines which said:

> le shell courant dans le second cas.

Inexact. C'est /bin/sh qui est appelé s'il n'y a pas de she-bang, pas
le shell courant.



Désolé, je le pensais et je n'ai pas vérifié. Merci de la rectification.

--
David.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
steve
Le 2008-07-02, à 09:48:49 +0200, Stephane Bortzmeyer () a écrit :

Lignes : 24

On Wed, Jul 02, 2008 at 09:12:45AM +0200,
steve wrote
a message of 41 lines which said:

> Je croyais que cette première ligne était *obligatoire* pour que le
> script s'exécute.

Non.

> 2) ./script.sh et script.sh est exécutable
>
> Donc dans les deux cas sans le sha-bang initial.

/bin/sh est l'interpréteur par défaut.



Après quelques recherches, j'ai trouvé ça dans [1] :

#! peut être omis si le script consiste seulement en un ensemble de
commandes système génériques, sans utiliser de directives shell interne.
Le second exemple, ci-dessus, requiert le #! initial car la ligne
d'affectation des variables, lignesP, utilise une construction
spécifique au shell.

Et comme l'un de vous :

Notez encore que #!/bin/sh appelle
l'interpréteur shell par défaut, qui est /bin/bash sur une machine
Linux.

C'est clair maintenant, merci à vous tous.


[1] http://abs.traduc.org/abs-5.3-fr/ch02.html

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Stephane Bortzmeyer
On Wed, Jul 02, 2008 at 11:38:23AM +0200,
steve wrote
a message of 46 lines which said:

Notez encore que #!/bin/sh appelle
l'interpréteur shell par défaut, qui est /bin/bash sur une machine
Linux.



Encore un raccourci dangereux. Rien dans Linux n'impose l'utilisation
de bash (dans la prochaine version de Debian, ce sera ash).

Linux est un noyau, pas un système d'exploitation.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
David Soulayrol
Le mercredi 02 juillet 2008 à 11:57 +0200, Stephane Bortzmeyer a écrit :
On Wed, Jul 02, 2008 at 11:38:23AM +0200,
steve wrote
a message of 46 lines which said:

> Notez encore que #!/bin/sh appelle
> l'interpréteur shell par défaut, qui est /bin/bash sur une machine
> Linux.

Encore un raccourci dangereux. Rien dans Linux n'impose l'utilisation
de bash (dans la prochaine version de Debian, ce sera ash).



Ce ne sera pas dash ? :)

Bon, OK, pour dire ça, j'aurai mieux fait de me taire...


Linux est un noyau, pas un système d'exploitation.



--
David.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Stephane Bortzmeyer
On Wed, Jul 02, 2008 at 02:11:33PM +0200,
David Soulayrol wrote
a message of 30 lines which said:

> Encore un raccourci dangereux. Rien dans Linux n'impose l'utilisation
> de bash (dans la prochaine version de Debian, ce sera ash).

Ce ne sera pas dash ? :)



Si, désolé, <http://release.debian.org/lenny/goals.txt>

À, au fait, pour Ubuntu (bonnes explications) :
<https://wiki.ubuntu.com/DashAsBinSh>

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact