logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 10-02-2011 12:10:04

PengouinPdt
Membre
Lieu : 47 - France
Distrib. : Sid | Xebian
Noyau : Linux 5.2.xyz
(G)UI : XFCE
Inscription : 09-02-2011
Site Web

[Bash] De l'intérêt de commencer son script par ...

Bonjour,

Je voulais discuter de l'intérêt de commencer s{on|es} script(s?) bash par ceci:

#!/bin/bash
#
cmd=`ls -l /bin/sh | awk '{print $NF}'`

if [ "$cmd" != "bash" ]; then
  echo "Hey ... the shell is $cmd - "
  echo "It's appear you run the script by 'sh $0' and not by './$0'!"
  echo "Please, run-it correctly - Bye!"
  exit
fi


Cela peut éviter aux utilisateurs qui utilisent nos scripts - voire se rappeler à soi-même ;-) - que le script bash doit être impérativement lancé ainsi './script'.

Oui, Non ?!

Hors ligne

#2 10-02-2011 12:17:52

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : [Bash] De l'intérêt de commencer son script par ...

Perso, j'ai des scripts root et user séparés, alors j'utilise le chemin absolu de chacun d'eux pour les envoyer, cron ou manuel, et basta ! smile

saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#3 13-02-2011 12:19:37

PengouinPdt
Membre
Lieu : 47 - France
Distrib. : Sid | Xebian
Noyau : Linux 5.2.xyz
(G)UI : XFCE
Inscription : 09-02-2011
Site Web

Re : [Bash] De l'intérêt de commencer son script par ...

Quoiqu'il en soit, dans l'état, même quand tu le lances par './script', tu remplis la première condition, donc le script s'arrête.

Pour résoudre cela, soit il faudrait mette en place une détection du mode de lancement, soit un mode d'interaction utilisateur par read tongue

Hors ligne

#4 13-02-2011 12:29:41

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [Bash] De l'intérêt de commencer son script par ...

Le #! est là pour sélectionner l'interpréteur à lancer pour exécuter le script.

Si tu veux savoir comment il a été lancé, tu peux regarder $0.
Mais attention, parce que les tests que tu vas faire ensuite sur $0 utilisent une syntaxe qui n'est pas indépendante du shell utilisé smile

De plus, avec ton test, tu es en train de faire une supposition sur le formatage de la sortie de ls, qui varie beaucoup d'un système à l'autre.

Dernière modification par Capitaine Fab (13-02-2011 13:02:19)


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#5 13-02-2011 13:43:28

PengouinPdt
Membre
Lieu : 47 - France
Distrib. : Sid | Xebian
Noyau : Linux 5.2.xyz
(G)UI : XFCE
Inscription : 09-02-2011
Site Web

Re : [Bash] De l'intérêt de commencer son script par ...

Oh, la commande 'ls' ne réagit pas pareil selon la distrib. Linux ?!

"Euhh !"

La variable bash $0 retourne le nom du script. Pas la manière dont il est lancé, ou alors, j'ai mal compris - ce qui est très possible tongue -, n'est-ce pas ?!

Hors ligne

#6 13-02-2011 14:04:10

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [Bash] De l'intérêt de commencer son script par ...

Ah tiens, le comportement n'est pas celui auquel je m'attendais.

En fait, $0 correspond à la ligne de commande (sans les arguments) qui a appelé le script.
Sauf qu'en l'occurence, le shell rappelle le script, et donc c'est la ligne de commande du shell qui est utilisée et non celle de l'utilisateur...

Exemple :

plouf.sh:
#!/bin/bash
echo $0

chmod +x plouf.sh

./plouf.sh
sh ./plouf.sh
sh < ./plouf.sh

smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#7 13-02-2011 14:17:55

cthuluh
Membre
Distrib. : stable
Noyau : stable
(G)UI : ratpoison
Inscription : 17-08-2010

Re : [Bash] De l'intérêt de commencer son script par ...

Manque de bol, $0 n'est pas une bonne méthode pour déterminer le nom de l'exécutable,
ni d'ailleurs pour déterminer le nom du script.

Un truc qui pourrait fonctionner proprement :

( [[ -n ${BASH_VERSION[0]} ]] ) 2>/dev/null || {
    echo "Veuillez lancer ce script ainsi : ``./script'' ou ``bash script''" >&2
    exit 1
}


Pour que le script continue, il faudra que :
* le shell supporte [[
* le shell supporte les tableaux
* la valeur de la première case du tableau BASH_VERSION soit "bash", or cette variable
   n'est présente que dans un shell bash (modulo l'utilisateur idiot qui décide d'exporter cette
   variable alors que rien ne l'y pousse, auquel cas il a sans doute les moyens de comprendre
   pourquoi il ne doit pas lancer ce script avec zsh ou ksh).

Hors ligne

Pied de page des forums