
Wenn Sie auf dem Terminal „vim Dateiname“ eingeben, weiß ich, dass vim den Dateinamen als Parameter erhält, aber ich vermute, dass ein Programm vim auch als Parameter erhält … ist das nur der Terminalemulator oder ein anderes Programm?
Antwort1
Zu dem Zeitpunkt, an dem Sie vim filename
in die Befehlszeile tippen, ist die Shell bereits gestartet, sodass die Shell (und der Terminalemulator) nicht vim
als Befehlszeilenargument verfügbar ist.
vim
, dagegen schon, aber das steht dem Benutzer nicht zur Verfügung. Wenn ein Programm gestartet wird, wird sein Namenormalerweiseals nulltes Kommandozeilenargument angegeben. Sie können dies sehen, indem Sie eine Shell starten und echoen $0
:
$ sh
$ echo $0
sh
$ exit
Die Shell führt die Befehle auf der Kommandozeile mit execve()
(oder einer ähnlichen exec()
Funktion) aus, derenPOSIX-Spezifikationsagt
Der Wert
argv[0]
sollte auf eine Dateinamenzeichenfolge verweisen, die mit dem Prozess verknüpft ist, der von einer derexec
Funktionen gestartet wird.
argv[0]
im obigen Text entspricht $0
in einem Shell-Skript.
Im Abschnitt „Begründung“ heißt es weiter:
Die Anforderung an eine streng konforme POSIX-Anwendung besagt außerdem, dassDer als erstes Argument übergebene Wert ist eine Dateinamenzeichenfolge, die mit dem gestarteten Prozess verknüpft ist.. Obwohl einige vorhandene Anwendungen unter Umständen einen Pfadnamen statt einer Dateinamenzeichenfolge übergeben, ist eine Dateinamenzeichenfolge im Allgemeinen nützlicher, da sie üblicherweise
argv[0]
zum Drucken von Diagnosen verwendet wird. In einigen Fällen ist der übergebene Dateiname nicht der tatsächliche Dateiname der Datei. Beispielsweise verwenden viele Implementierungen des Anmeldedienstprogramms die Konvention, dem tatsächlichen Dateinamen ein<hyphen-minus>
(-
) voranzustellen, was dem aufgerufenen Befehlsinterpreter anzeigt, dass es sich um eine „Anmeldeshell“ handelt.