J'aurais besoin de précisions sur la façon dont nous exécutons les exécutables sous le terminal. Cela peut être une question boiteuse mais quelle est la différence entre exécuter un exécutable avec ./an_executable
et . an_executable
(supposons que nous sommes dans le répertoire où se trouve an_executable)
Je sais déjà que le premier fait que le shell recherche un_exécutable dans le répertoire courant ( .
), mais pourquoi n'est-il pas /
nécessaire après l' .
utilisation de la dernière version?
Merci d'avance.
command-line
executable
zipzap
la source
la source
Réponses:
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 bashsource
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 faireexecutable
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 dels
. 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: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 nouveaubash
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é, laexit
commande quitte ce nouveau shell et votre shell actuel n'est pas affecté.Si vous
. script
, votre terminal actuel se fermera, car laexit
commande s'exécute dans le shell actuel. C'est donc équivalent à taperexit
sur l'invite de commande.la source
ls
sortie: vous tapez la commande, elle s'exécute, affiche la sortie puis se termine, mais la sortie reste dans le terminal.bash
shell s'exécutant à l'intérieur. Si vous tapezbash
, vous exécuterez un autre shell; au premier shell, c'est juste un programme à exécuter. Si vous tapezexit
, vous fermerez le dernier shell que vous avez démarré mais vous serez toujours dans le premier shell (celui à partir duquel vous avez démarré le terminal). Encore une fois, tout cela se produit dans le même terminal.