Die . executable
Syntax funktioniert nicht mit jeder ausführbaren Datei (oder?). Stattdessen ist es ein Alias für die source
eingebaute Bash . Der Unterschied ist also hauptsächlich für Bash-Skripte relevant, und die Wahrheit ist, dass sie völlig verschiedene Dinge sind :)
./executable
fragt, ob die ausführbare Datei "normal" ausgeführt werden soll. ./
ist ein relativer Verweis auf den aktuellen Pfad. Dadurch wird vermieden, dass die Shell (bash) versucht, die ausführbare Datei in einem Verzeichnis zu finden $PATH
(was auch dann der Fall ist, wenn Sie mit dem Befehl keinen Pfad angegeben haben). Der Grund, warum Sie dies nicht einfach tun können, executable
liegt in der Sicherheit. Stellen Sie sich vor, Sie dekomprimieren ein Archiv, das Sie heruntergeladen haben, und es enthält eine bösartige Version von ls
. Wenn es direkt von Ihrem aktuellen Verzeichnis aus ausgeführt würde, würden Sie diese Version ausführen, ohne es zu merken.
Auf der anderen Seite . executable
heißt es "Quelle einer Datei mit dem Namen executable
". Da Sie die Datei direkt benennen und es sich nicht unbedingt um eine ausführbare Datei handeln muss, gilt die Sicherheitsbeschränkung für $ PATH nicht. Sourcing wird nur Shell-Skripte "ausführen" (oder anscheinend ausführen). Was es tut, ist:
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.
Also ... Was ist wirklich der Unterschied zwischen Executing und Sourcing? Wenn Sie dasselbe Shell-Skript annehmen, wird durch Ausführen von it ( ./script
) eine neue Shell erstellt, das Skript in dieser Shell ausgeführt. Wenn das Skript beendet wird, schließen Sie diese Shell und kehren zur übergeordneten Shell zurück. Tatsächlich wird ein neuer bash
Prozess zum Ausführen des Skripts gestartet .
( . script
) bewirkt, dass die aktuelle Shell die Befehle aus der Datei liest, als würden sie in die Befehlszeile eingegeben. Es wurde keine neue Shell erzeugt.
Ein sehr einfacher Weg, um zu sehen, wie sich dies verhält, besteht darin, ein Skript zu schreiben, das nur enthält exit
. Wenn Sie ./script
es tun, scheint nichts zu passieren. Dies liegt daran, dass ein neuer Shell-Prozess gestartet wird, der exit
Befehl diese neue Shell beendet und Ihre aktuelle Shell nicht betroffen ist.
Wenn Sie dies tun . script
, wird das aktuelle Terminal geschlossen, da der exit
Befehl in der aktuellen Shell ausgeführt wird. Das entspricht also der Eingabe exit
an der Eingabeaufforderung.