Il "invocato come" si riferisce a qualunque è che il processo partendo mette Bash nel suo argomento riga di comando "zeroth" argv[0]
.
Quando un programma viene avviato con i exec*()
syscalls , non conoscono realmente il nome del file binario contenente il programma, ma invece il processo di chiamata è libero di inserire quello che vuole lì. Di solito, ovviamente, il nome viene preso dal filesystem, quindi se lo esegui /bin/sh
, è quello che viene messo lì. E se /bin/sh
è Bash, non deve essere un collegamento simbolico, potrebbe essere un collegamento reale o solo un'altra copia del programma shell.
Come esempio di impostazione del "nome del programma", il exec
comando di Bash può impostare l'argomento zeroth con l' -a
opzione. (Potremmo fare lo stesso con Perl o direttamente con C, ecc.)
Ecco myname
un semplice programma C che stampa solo il suo argomento zeroth, il nome che vede se stesso:
$ ./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;
}
Ma, per rispondere alle domande numerate ...
(1 & 4) running sh somescript
funzionerà qualunque cosa sh
sia sulla tua PATH
, probabilmente /bin/sh
ma forse qualcosa del genere/usr/xpg4/bin/sh
.
- Se è Bash, viene eseguito in modalità POSIX, poiché vede il nome
sh
.
- Se è la shell Z o la shell Korn, allo stesso modo vede il nome
sh
, ma funziona in modalità "SH compatibile", che mira a essere compatibile con la shell Bourne ed è leggermente diverso dalla modalità conforme POSIX completa in entrambe le shell .
- Potrebbe essere la conchiglia Almquist, una vera conchiglia Bourne, o qualcos'altro, ovviamente.
(2 & 5) Esecuzione bash somescript
verrà eseguito in modalità Bash regolare (di nuovo, ovviamente dipende da cosa bash
nei vostri PATH
IS.)
(3) Qui, il nome dello script viene dato direttamente alla chiamata di sistema al posto del file di programma. Il kernel legge la riga hashbang e la usa per eseguire lo script.
(6) Questo è quello complesso. È simile a (3), ma la chiamata di sistema per l'avvio del programma fallisce ( ENOEXEC (Exec format error)
), poiché non esiste una linea hashbang. Quello che succede dopo dipende dal fatto che la shell in esecuzione sia essa stessa in modalità POSIX. POSIX richiede che una shell conforme a POSIX si comporti in un modo specifico in risposta a ENOEXEC
. Tuttavia, esiste un margine di manovra in "un comando equivalente a quello di invocare una shell", il che significa che shell diverse fanno cose diverse.
- La shell Bourne Again si esegue nuovamente nella stessa modalità con il nome dello script come primo argomento della riga di comando. Nella sua modalità conforme a POSIX, sta ovviamente eseguendo se stesso nella sua modalità conforme a POSIX, obbedendo così al requisito POSIX di invocare una shell conforme a POSIX.
- La shell Z, la shell Almquist e la shell Korn vengono eseguite
/bin/sh
con il nome dello script inserito prima degli altri argomenti come primo argomento della riga di comando. La shell Z, la shell Almquist e la shell Korn stanno (tentando) di invocare una shell conforme a POSIX a forza di supporre che il /bin/sh
programma sia uno.