Das "aufgerufen als" bezieht sich auf alles, was der Prozess, der Bash startet, in sein "nulltes" Befehlszeilenargument einfügt argv[0]
.
Wenn ein Programm mit den exec*()
Syscalls gestartet wird, erfahren sie nicht wirklich den Namen der Binärdatei, die das Programm enthält, sondern der aufrufende Prozess kann dort beliebig viel ablegen . Normalerweise wird der Name natürlich aus dem Dateisystem übernommen. Wenn Sie also ausführen /bin/sh
, wird dieser dort abgelegt. Und wenn /bin/sh
es sich um Bash handelt, muss es sich nicht um einen Symlink handeln, sondern um einen Hardlink oder nur um eine weitere Kopie des Shell-Programms.
Als Beispiel für das Setzen des "Programmnamens" kann der exec
Befehl von Bash das nullte Argument mit der -a
Option setzen. (Wir könnten dasselbe mit Perl oder direkt mit C usw. machen.)
Hier myname
ist ein einfaches C-Programm, das nur sein nulltes Argument druckt, den Namen, den es selbst sieht:
$ ./myname
I am ./myname
$ (exec -a something ./myname )
I am something
$ mv ./myname somename
$ ln -s somename othername
$ ./somename
I am ./somename
$ ./othername
I am ./othername
Quelle:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Aber um die nummerierten Fragen zu beantworten ...
(1 & 4) Laufen sh somescript
wird laufen, was auch sh
immer auf Ihrem ist PATH
, wahrscheinlich /bin/sh
aber möglicherweise so etwas/usr/xpg4/bin/sh
.
- Wenn es Bash ist, wird es im POSIX-Modus ausgeführt, da der Name angezeigt wird
sh
.
- Wenn es sich um die Z-Shell oder die Korn-Shell handelt, wird der Name ebenfalls angezeigt, sie
sh
wird jedoch im "SH-kompatiblen" Modus ausgeführt, der darauf abzielt, mit der Bourne-Shell kompatibel zu sein, und sich in beiden Shells geringfügig vom vollständigen POSIX-konformen Modus unterscheidet .
- Es könnte natürlich die Almquist-Shell sein, eine echte Bourne-Shell oder etwas anderes.
(2 & 5) Das Laufen bash somescript
wird im regulären Bash-Modus ausgeführt (wieder hängt es natürlich davon ab, was sich bash
in Ihrem PATH
befindet.)
(3) Hier wird der Name des Skripts anstelle der Programmdatei direkt dem Systemaufruf gegeben. Der Kernel liest die Hashbang-Zeile und verwendet sie zum Ausführen des Skripts.
(6) Dies ist die komplexe. Es ist ähnlich wie (3), aber der Systemaufruf zum Starten des Programms schlägt fehl ( ENOEXEC (Exec format error)
), da keine Hashbang-Zeile vorhanden ist. Was als nächstes passiert, hängt davon ab, ob sich die von Ihnen ausgeführte Shell selbst im POSIX-Modus befindet. POSIX erfordert, dass sich eine POSIX-konforme Shell als Reaktion auf eine bestimmte Art und Weise verhält ENOEXEC
. Es gibt jedoch einen gewissen Spielraum in "einem Befehl, der dem Aufrufen einer Shell entspricht", was bedeutet, dass verschiedene Shells unterschiedliche Aufgaben ausführen.
- Die Bourne Again-Shell wird im selben Modus mit dem Namen des Skripts als erstem Befehlszeilenargument erneut ausgeführt. In seinem POSIX-konformen Modus läuft es natürlich selbst in seinem POSIX-konformen Modus und befolgt somit die POSIX-Anforderung, eine POSIX-konforme Shell aufzurufen.
- Die Z-Shell, die Almquist-Shell und die Korn-Shell werden
/bin/sh
mit dem Namen des Skripts ausgeführt, das vor den anderen Argumenten als erstes Befehlszeilenargument eingefügt wurde. Die Z-Shell, die Almquist-Shell und die Korn-Shell versuchen, eine POSIX-konforme Shell aufzurufen, indem angenommen wird, dass es sich bei dem /bin/sh
Programm um eines handelt.