Ich brauche eine Klarstellung darüber, wie wir ausführbare Dateien unter dem Terminal ausführen. Dies mag eine lahme Frage sein, aber was ist der Unterschied zwischen dem Ausführen einer ausführbaren Datei mit ./an_executable
und . an_executable
(nehmen wir an, dass wir uns in dem Verzeichnis befinden, in dem sich eine ausführbare Datei befindet)
Ich weiß bereits, dass erstere die Shell im aktuellen Verzeichnis ( .
) nach an_executable suchen lässt , aber warum wird /
nachher keine benötigt, .
wenn die letztere Version verwendet wird?
Danke im Voraus.
command-line
executable
Zip Zap
quelle
quelle
Antworten:
Die
. executable
Syntax funktioniert nicht mit jeder ausführbaren Datei (oder?). Stattdessen ist es ein Alias für diesource
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 vonls
. 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 Namenexecutable
". 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: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 neuerbash
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, derexit
Befehl diese neue Shell beendet und Ihre aktuelle Shell nicht betroffen ist.Wenn Sie dies tun
. script
, wird das aktuelle Terminal geschlossen, da derexit
Befehl in der aktuellen Shell ausgeführt wird. Das entspricht also der Eingabeexit
an der Eingabeaufforderung.quelle
ls
Ausgabe immer noch sehen können : Sie geben den Befehl ein, er wird ausgeführt, zeigt die Ausgabe an und endet dann, aber die Ausgabe bleibt im Terminal.bash
Shell angezeigt . Bei derbash
Eingabe wird eine andere Shell ausgeführt. Für die erste Shell ist es nur ein auszuführendes Programm. Wenn Sieexit
etwas eingeben, schließen Sie die letzte Shell, die Sie gestartet haben, befinden sich aber immer noch in der ersten Shell (diejenige, von der an Sie das Terminal gestartet haben). Auch dies geschieht alles im selben Terminal.