Si script.sh est juste quelque chose de typique comme
#!/bin/bash
echo "Hello World!"
Existe-t-il un moyen privilégié d’exécuter le script? Je pense que vous devez d’abord le chmod pour qu’il devienne exécutable?
Si script.sh est juste quelque chose de typique comme
#!/bin/bash
echo "Hello World!"
Existe-t-il un moyen privilégié d’exécuter le script? Je pense que vous devez d’abord le chmod pour qu’il devienne exécutable?
Réponses:
Pour votre script spécifique, les deux méthodes fonctionneront, sauf que cela ./script.sh
nécessite une exécution et des bits lisibles, alors que bash script.sh
ne nécessite qu'un bit lisible.
La différence d’exigences en matière d’autorisations tient à la façon dont le programme qui interprète votre script est chargé:
./script.sh
fait en sorte que votre shell exécute le fichier comme s’il s’agissait d’un exécutable normal.Le shell se lance lui-même et utilise un appel système (par exemple execve
) pour que le système d'exploitation exécute le fichier dans le processus forké. Le système d'exploitation vérifiera les autorisations du fichier (le bit d'exécution doit donc être défini) et transmettra la demande au chargeur de programmes , qui examinera le fichier et déterminera comment l'exé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 hashbang signifie que le fichier est un script et doit être interprété par le programme spécifié après le hashbang. Cela permet au script lui-même de dire au système comment interpréter le script.
Avec votre script, le chargeur de programme s’exécutera /bin/bash
et passera ./script.sh
comme argument de ligne de commande.
bash script.sh
rend votre shell exécuté bash
et passé script.sh
comme argument de ligne de commandeDonc, le système d'exploitation va se charger bash
(même pas regarder script.sh
, parce que c'est juste un argument de ligne de commande). Le bash
processus créé interprétera alors le script.sh
parce qu'il est passé comme argument de ligne de commande. Parce script.sh
que n'est lu que par bash
un fichier normal, le bit d'exécution n'est pas requis.
Je vous recommande ./script.sh
cependant d' utiliser , car vous pourriez ne pas savoir quel interprète le script requiert. Laissez donc le programme de chargement le déterminer pour vous.
. ./script.sh
n'est pas la même chose que bash script.sh
(ou ./script.sh
. Considérons le script #!/usr/bin/python -V
<nouvelle ligne> print test
.
. script.sh
. Mais je suis d'accord avec les personnes qui découragent l'utilisation de la .
commande sur des scripts qui n'étaient pas censés être invoqués de cette façon. Je suis surpris que personne ne mentionne que, si le script contient des exit
commandes et que vous le sourcez, il pourrait vous déconnecter. Un problème moins grave se poserait si le script effectuait une cd
, car cela affecterait également le shell parent (interactif).
bash script.sh
invoque le script directement à l'aide du 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 le faites, bash script.sh
vous pourriez le savoir which bash
.
Donc, dans votre exemple, cela ne fait aucune différence. Oui, vous devezchmod +x script.sh
être capable de l'exécuter directement via ./script.sh
.
/bin/bash
c’est le premier bash
dans votre cas $PATH
.
#!/bin/bash
ne fonctionne que s'il y a un/bin/bash
./script.sh
.
Créez un fichier Delete_Self.sh comme ceci:
#!/bin/rm
echo I am still here!
Exécutez ce script comme sh Delete_Self.sh
vous le verrez "Je suis toujours là!" fait écho en arrière.
Rendez-le exécutable et exécutez-le en tant que ./Delete_Self.sh
vous verrez que rien ne sera renvoyé, alors que le fichier Delete_Self.sh
lui-même est parti.
Donc la différence est que:
bash script.sh
va ignorer le #! line, parce que bash est spécifié comme programme d’exécution de script.sh../script.sh
va lire le #! ligne pour déterminer le programme à exécuter script.sh
.Outre les autres réponses, connaître la différence entre l'exécution d'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) l'exécute dans le dossier shell actuel - qui peut être obligatoire si l'exécutable modifie les variables d'environnement qui doivent être préservées après la fermeture de l'exécutable. Par exemple, pour activer un environnement Python Conda, vous devez utiliser les éléments suivants:
source activate my_env
NB Une autre alternative à source
celle que vous pouvez rencontrer est la fonction .
intégrée, à savoir
. activate my_env