O "invocado como" refere-se a qualquer coisa que o processo que inicia o Bash coloca em seu argumento de linha de comando "zeroth" argv[0],.
Quando um programa é iniciado com os exec*()syscalls , eles realmente não conhecem o nome do arquivo binário que contém o programa, mas o processo de chamada é livre para colocar o que quiser lá. Normalmente, é claro, o nome é retirado do sistema de arquivos, portanto, se você executar /bin/sh, é isso que é colocado lá. E se /bin/shfor o Bash, ele não precisa ser um link simbólico, pode ser um link físico ou apenas outra cópia do programa shell.
Como um exemplo de configuração do "nome do programa", o execcomando do Bash pode definir o argumento zeroth com a -aopção (Poderíamos fazer o mesmo com Perl, ou diretamente com C, etc.)
Aqui mynameestá um programa C simples que apenas imprime seu argumento zero, o nome que ele próprio vê:
$ ./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
Fonte:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Mas, para responder às perguntas numeradas ...
(1 e 4) a execução sh somescriptexecutará o que shestiver no seu PATH, provavelmente, /bin/shmas possivelmente algo como/usr/xpg4/bin/sh .
- Se for o Bash, ele será executado no modo POSIX, pois ele vê o nome
sh.
- Se for o shell Z ou o shell Korn, ele também verá o nome
sh, mas será executado no modo "Compatível com SH", que visa ser compatível com o shell Bourne e é sutilmente diferente do modo compatível com POSIX completo em ambos os shells. .
- Poderia ser a concha Almquist, uma concha Bourne real, ou qualquer outra coisa, é claro.
(2 e 5) A corrida bash somescriptserá executada no modo Bash regular (novamente, é claro, depende do que está bashno seu PATH.)
(3) Aqui, o nome do script é dado diretamente à chamada do sistema no lugar do arquivo do programa. O kernel lê a linha hashbang e a usa para executar o script.
(6) Esse é o complexo. É semelhante a (3), mas a chamada do sistema para iniciar o programa falha ( ENOEXEC (Exec format error)), pois não há linha hashbang. O que acontece a seguir depende de se o shell que você está executando é em si no modo POSIX. O POSIX requer que um shell compatível com POSIX se comporte de uma maneira específica em resposta a ENOEXEC. No entanto, há alguma margem de manobra em "um comando equivalente a invocar um shell", o que significa que diferentes tipos de conchas fazem coisas diferentes.
- O shell Bourne Again é executado novamente no mesmo modo com o nome do script que seu primeiro argumento de linha de comando. Em seu modo compatível com POSIX, é claro que ele está se executando no modo compatível com POSIX, obedecendo, assim, ao requisito POSIX de invocar um shell compatível com POSIX.
- O shell Z, o shell Almquist e o Korn são executados
/bin/shcom o nome do script inserido antes dos outros argumentos como o primeiro argumento da linha de comando. O shell Z, o shell Almquist e o Korn estão (tentando) invocar um shell compatível com POSIX com a suposição de que o /bin/shprograma é um.