Si script.sh est juste quelque chose de typique comme
#!/bin/bash echo "Hello World!"
Y a-t-il une préférence façon dexécuter le script? Je pense que vous devez dabord le chmod pour quil devienne exécutable?
Réponse
Pour votre script spécifique, les deux méthodes fonctionneront, sauf que ./script.sh
nécessite des bits dexécution et des bits lisibles, tandis que bash script.sh
ne nécessite que des bits lisibles.
La raison de la différence dexigence dautorisations réside dans la façon dont le programme qui interprète votre script est chargé:
-
./script.sh
fait que votre shell exécute le fichier comme sil sagissait dun fichier normal exécutable.
Le shell se fourche et utilise un appel système (par exemple execve
) pour que le système dexploitation exécute le fichier dans le processus forké. Le système dexploitation vérifiera les autorisations du fichier (le bit dexécution doit donc être défini) et transmettra la requête au chargeur de programme , qui examine le fichier et détermine comment lexécuter. Sous Linux, les exécutables compilés commencent par un nombre magique ELF , tandis que les scripts commencent par un #!
( hashbang ). Un en-tête de hachage signifie que le fichier est un script et doit être interprété par le programme spécifié après le hachage. Cela permet un script lui-même pour indiquer au système comment interpréter le script.
Avec votre script, le chargeur de programme exécutera /bin/bash
et transmettra ./script.sh
comme argument de ligne de commande.
-
bash script.sh
fait exécuter votre shellbash
et le passerscript.sh
comme argument de ligne de commande
Le système dexploitation chargera donc (ne regardant même pas script.sh
, car ce nest quun argument de ligne de commande). Le processus bash
créé interprétera ensuite le script.sh
car il « est passé comme argument de ligne de commande. Parce que script.sh
nest lu que par bash
comme un fichier normal, le bit dexécution nest pas nécessaire.
Je recommande dutiliser ./script.sh
cependant, car vous ne savez peut-être pas quel interpréteur le script a besoin. Laissez donc le chargeur de programme le déterminer pour vous.
Commentaires
- Si le bit exécutable nest pas défini, vous pouvez également exécuter le script en faisant ". ./script.sh"
- @Dog Vous avez raison. Le point est un raccourci pour la commande intégrée ' source ' , qui exécute le script dans le processus bash actuel. Ainsi, seul le bit lisible est requis.
- @Dogeatcatworld tant que cela est vrai, exécuter
. ./script.sh
nest pas la même chose comme (ou./script.sh
. Considérez le script#!/usr/bin/python -V
< newline >print test
. - Attention, le sourcing dun script peut entraîner une contamination de la session interactive. Par exemple, si un script modifie la variable denvironnement PATH, cette modification affectera les commandes exécutées après la source. Cette approche devrait vraiment être réservée aux situations où vous dépendez des effets secondaires (scripts de configuration denvironnement, etc.). Pour les autres situations où vous pouvez ' t modifier les autorisations, exécuter la commande dans la ligne shebang, en suivant le nom du script, est lapproche la plus sûre.
- Notez que , si vous créez un script dans le répertoire courant, vous navez pas besoin dutiliser ./ ; dites simplement
. script.sh
. Mais je suis d’accord avec ceux qui découragent d’utiliser la commande.
sur des scripts qui n’étaient pas censés être invoqués de cette façon. Je suis surpris que personne nait mentionné que, si le script contient des commandesexit
et que vous le fournissez, il pourrait vous déconnecter. Un problème moins grave serait si le script fait uncd
, car cela affecterait également le shell parent (interactif).
Answer
bash script.sh
appelle le script directement à laide de bash.
./script.sh
utilise le shebang #!/bin/bash
pour déterminer comment exécuter.
Si vous voulez vraiment savoir, quel binaire est exécuté si vous faites un bash script.sh
vous pourriez le découvrir avec which bash
.
Donc, dans votre exemple, cela ne fait aucune différence. Oui, vous devez chmod +x script.sh
pour pouvoir lexécuter directement via ./script.sh
.
Commentaires
Réponse
Créez un fichier Delete_Self.sh comme ceci:
#!/bin/rm echo I am still here!
Exécutez ceci script comme sh Delete_Self.sh
vous verrez « Je suis toujours là! » renvoyé en écho.
Rendez-le exécutable et exécutez-le en tant que ./Delete_Self.sh
vous ne verrez rien nest renvoyé, tandis que le fichier Delete_Self.sh
lui-même a disparu.
Donc la différence est que:
-
bash script.sh
ignorera le #! ligne, car bash est spécifié comme programme pour exécuter script.sh. -
./script.sh
lira le #! ligne pour déterminer le programme à exécuterscript.sh
.
Commentaires
- +1 pour le bel exemple
Answer
En plus des autres réponses, connaître la différence entre exécuter un script via ./script.sh
(i) et source ./script.sh
(ii) est utile – La version (i) crée un nouveau shell dans lequel exécuter la commande, alors que (ii) lexécute dans le shell actuel – ce qui peut être obligatoire si lexécutable change les variables denvironnement qui doivent être préservées après la fermeture de lexécutable. Par exemple, pour activer un environnement conda python, il faut utiliser les éléments suivants:
source activate my_env
N.B. Une autre alternative à source
que vous pouvez rencontrer est le .
intégré, cest-à-dire
. activate my_env
/bin/bash
est le premierbash
dans votre$PATH
.#!/bin/bash
ne fonctionne que sil y a un/bin/bash
./script.sh
.