La . executable
syntaxe ne fonctionne pas avec n'importe quel exécutable (ou le fait-il?). Au lieu de cela, c'est un alias pour le bash source
intégré. Donc, la différence concerne principalement les scripts bash, et la vérité est que ce sont des choses complètement différentes :)
./executable
demande d'exécuter l'exécutable "normalement". ./
est une référence relative au chemin actuel. Cela évite que le shell (bash) essaie de localiser l'exécutable dans un répertoire de son $PATH
(ce qu'il ferait si vous ne spécifiiez pas du tout un chemin avec la commande). La raison pour laquelle vous ne pouvez pas simplement faire executable
est une question de sécurité; imaginez que vous décompressez une archive que vous avez téléchargée et qu'elle contient une version malveillante de ls
. S'il s'exécutait directement à partir de votre répertoire actuel, vous exécuteriez cette version sans vous en rendre compte.
D'autre part, . executable
dit "source d'un fichier nommé executable
". Étant donné que vous nommez directement le fichier et qu'il ne doit vraiment pas être un exécutable, la restriction de sécurité pour $ PATH ne s'applique pas. Le sourcing "exécutera" (ou semblera exécuter) uniquement les scripts shell. Ce qu'il fait c'est:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
Alors ... Quelle est vraiment la différence entre l'exécution et le sourcing? En supposant le même script shell, son exécution ( ./script
) générera un nouveau shell, exécutera le script à l'intérieur de ce shell, et lorsque le script se fermera, fermez ce shell et revenez au shell parent. En effet, il lancera un nouveau bash
processus pour exécuter le script).
( . script
) obligera le shell actuel à lire les commandes du fichier comme si elles étaient saisies dans la ligne de commande. Il n'y a pas de nouvel obus apparu.
Un moyen très simple de voir comment cela se comporte est d'écrire un script qui ne contient que exit
. Si vous ./script
le faites , rien ne semble se produire, car un nouveau processus de shell est démarré, la exit
commande quitte ce nouveau shell et votre shell actuel n'est pas affecté.
Si vous . script
, votre terminal actuel se fermera, car la exit
commande s'exécute dans le shell actuel. C'est donc équivalent à taper exit
sur l'invite de commande.