«Викликається як» ставиться до того , що це те , що процес запуску Bash ставить у своїй «нульовий» аргумент командного рядка, argv[0].
Коли програма запускається з exec*()систематичними дзвінками , вони насправді не дізнаються назву двійкового файлу, що містить програму, але натомість процес виклику вільний помістити все, що хоче. Звичайно, звичайно, ім'я береться з файлової системи, тож якщо ви запустите /bin/sh, це те, що туди ставиться. І якщо /bin/shце Bash, це не повинно бути символьним посиланням, це може бути жорстке посилання або просто інша копія програми оболонки.
Як приклад встановлення "імені програми", execкоманда Баша може встановити нульовий аргумент за допомогою -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", який спрямований на сумісність оболонки Борна і тонко відрізняється від повного режиму, відповідного POSIX в обох цих оболонках .
- Це могла бути оболонка Алквіста, фактична оболонка Борна чи щось інше, звичайно.
(2 і 5) Біг bash somescriptбуде працювати в звичайному режимі Bash (знову ж, це, звичайно, залежить від того, що bashу вас PATHє.)
(3) Тут назва скрипту вводиться безпосередньо до системного виклику замість файлу програми. Ядро зчитує рядок hashbang і використовує його для запуску сценарію.
(6) Це складний. Це аналогічно (3), але системний виклик для запуску програми виходить з ладу ( ENOEXEC (Exec format error)), оскільки немає лінії хешбангу. Що буде далі, залежить від того, чи знаходиться оболонка, яку ви працюєте, сама в режимі POSIX. POSIX вимагає, щоб оболонка, сумісна з POSIX, поводилася конкретно у відповідь на ENOEXEC. Однак є деяка свобода в "команді, еквівалентній виклику оболонки", що означає, що різні оболонки роблять різні речі.
- Оболонка Bourne Again знову запускається в тому ж режимі з назвою сценарію, що і його перший аргумент командного рядка. У режимі, сумісному з POSIX, він, звичайно, працює у своєму режимі, сумісному з POSIX, таким чином, підкоряючись вимозі POSIX, щоб викликати оболонку, сумісну з POSIX.
- Оболонка Z, оболонка Almquist і оболонка Korn виконуються
/bin/shз назвою скрипту, вставленого перед іншими аргументами, як його першого аргументу командного рядка. Оболонка Z, оболонка Almquist і оболонка Korn намагаються викликати оболонку, сумісну з POSIX, припускаючи, що /bin/shпрограма передбачає одну.