„Wywołany jako” odnosi się do wszystkiego, co proces uruchamiający Bash umieszcza w argumencie wiersza poleceń „zero” argv[0]
.
Kiedy program jest uruchamiany z exec*()
syscallami , tak naprawdę nie znają nazwy pliku binarnego zawierającego program, ale zamiast tego proces wywoływania może umieścić tam, co chce. Zwykle oczywiście nazwa jest pobierana z systemu plików, więc jeśli uruchomisz /bin/sh
, to właśnie tam zostanie umieszczona. A jeśli /bin/sh
jest to Bash, nie musi to być dowiązanie symboliczne, może to być dowiązanie twarde lub po prostu kolejna kopia programu powłoki.
Jako przykład ustawienia „nazwy programu”, exec
polecenie Bash może ustawić argument zerowy z -a
opcją. (Możemy zrobić to samo z Perlem lub bezpośrednio z C itp.)
Oto myname
prosty program C, który po prostu wypisuje swój zerowy argument, nazwę, którą widzi:
$ ./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
Źródło:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Ale, aby odpowiedzieć na ponumerowane pytania ...
(1 i 4) bieganie sh somescript
uruchomi wszystko, co sh
jest na twoim PATH
, prawdopodobnie, /bin/sh
ale prawdopodobnie coś takiego/usr/xpg4/bin/sh
.
- Jeśli jest to Bash, działa w trybie POSIX, ponieważ widzi nazwę
sh
.
- Jeśli jest to powłoka Z lub Korn, również widzi nazwę
sh
, ale działa w trybie „kompatybilnym z SH”, który ma na celu być kompatybilnym z powłoką Bourne'a i jest nieco inny niż tryb zgodny z POSIX w obu tych powłokach .
- Może to być skorupa Almquista, rzeczywista skorupa Bourne'a lub oczywiście coś innego.
(2 i 5) Bieganie bash somescript
będzie działało w zwykłym trybie Bash (znowu, oczywiście zależy to od tego, co bash
masz PATH
).
(3) Tutaj nazwa skryptu jest podawana bezpośrednio do wywołania systemowego zamiast pliku programu. Jądro czyta wiersz hashbanga i używa go do uruchomienia skryptu.
(6) To jest złożony. Jest podobny do (3), ale wywołanie systemowe do uruchomienia programu kończy się niepowodzeniem ( ENOEXEC (Exec format error)
), ponieważ nie ma linii mieszania. Co dzieje się dalej, zależy od tego, czy powłoka że używasz jest się w trybie POSIX. POSIX wymaga, aby powłoka zgodna z POSIX zachowywała się w określony sposób w odpowiedzi na ENOEXEC
. Istnieje jednak pewien margines swobody w „poleceniu równoważnym wywołaniu powłoki”, co oznacza, że różne powłoki wykonują różne czynności.
- Powłoka Bourne Again ponownie uruchamia się w tym samym trybie z nazwą skryptu jako pierwszego argumentu wiersza poleceń. W trybie zgodnym z POSIX działa oczywiście w trybie zgodnym z POSIX, spełniając w ten sposób wymóg POSIX dotyczący wywołania powłoki zgodnej z POSIX.
- Powłoka Z, powłoka Almquist i powłoka Korna działają
/bin/sh
z nazwą skryptu wstawioną przed innymi argumentami jako pierwszym argumentem wiersza poleceń. Powłoka Z, powłoka Almquista i powłoka Korna (próbują) wywołać powłokę zgodną z POSIX, zakładając, że /bin/sh
program jest jednym.