«Вызывается как» относится к тому , что это то , что процесс запуска Bash ставит в своей «нулевой» аргумент командной строки, argv[0]
.
Когда программа запускается с exec*()
системными вызовами , они на самом деле не узнают имя двоичного файла, содержащего программу, но вместо этого вызывающий процесс может свободно поместить туда все, что захочет. Обычно, конечно, имя берется из файловой системы, так что если вы запустите /bin/sh
, это то, что там будет помещено. И если /bin/sh
это Bash, это не должна быть символическая ссылка, это может быть жесткая ссылка или просто еще одна копия программы оболочки.
В качестве примера установки «имени программы» exec
команда Bash может установить нулевой аргумент с -a
параметром. (Мы можем сделать то же самое с Perl или напрямую с C и т. Д.)
Вот myname
простая C-программа, которая просто печатает свой нулевой аргумент, имя, которое она видит сама:
$ ./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
Источник:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Но, чтобы ответить на пронумерованные вопросы ...
(1 и 4) бег sh somescript
будет работать, что sh
на вас PATH
, вероятно, /bin/sh
но, возможно, что-то вроде/usr/xpg4/bin/sh
.
- Если это Bash, он работает в режиме POSIX, так как видит имя
sh
.
- Если это оболочка Z или оболочка Korn, она также видит имя
sh
, но работает в режиме «SH-совместимости», который нацелен на совместимость с оболочкой Bourne и слегка отличается от режима полного соответствия POSIX в обеих этих оболочках. ,
- Это может быть оболочка Альмквиста, настоящая оболочка Борна или что-то еще, конечно.
(2 и 5) Запуск bash somescript
будет выполняться в обычном режиме Bash (опять же, это, конечно, зависит от того, что bash
у вас PATH
есть.)
(3) Здесь имя сценария присваивается непосредственно системному вызову вместо файла программы. Ядро читает строку hashbang и использует ее для запуска скрипта.
(6) Это сложный. Это похоже на (3), но системный вызов для запуска программы завершается с ошибкой ( ENOEXEC (Exec format error)
), так как нет строки hashbang. Что произойдет дальше , зависит от того , является ли оболочка , что вы работаете на себя в режиме POSIX. POSIX требует, чтобы POSIX-совместимая оболочка вела себя особым образом в ответ на ENOEXEC
. Однако в «команде, эквивалентной вызову оболочки», есть некоторая свобода действий, которая означает, что разные оболочки делают разные вещи.
- Оболочка Bourne Again повторно запускает себя в том же режиме, в котором имя сценария используется в качестве первого аргумента командной строки. В своем режиме, соответствующем POSIX, он, конечно же, работает в режиме, соответствующем POSIX, тем самым подчиняясь требованию POSIX для вызова оболочки, соответствующей POSIX.
- Оболочка Z, оболочка Almquist и оболочка Korn запускаются
/bin/sh
с именем сценария, вставленным перед остальными аргументами в качестве первого аргумента командной строки. Оболочка Z, оболочка Almquist и оболочка Korn (пытаются) вызвать POSIX-совместимую оболочку, предполагая, что /bin/sh
программа одна.