«Вызывается как» относится к тому , что это то , что процесс запуска 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программа одна.