El "se invoca como" se refiere a lo que sea que el proceso a partir del golpe pone en su argumento de línea de comandos "cero", argv[0].
Cuando se inicia un programa con las exec*()llamadas al sistema , en realidad no conocen el nombre del archivo binario que contiene el programa, sino que el proceso de llamada es libre de poner lo que quiera allí. Por lo general, por supuesto, el nombre se toma del sistema de archivos, por lo que si ejecuta /bin/sh, eso es lo que se pone allí. Y si /bin/shes Bash, no tiene que ser un enlace simbólico, podría ser un enlace duro o simplemente otra copia del programa de shell.
Como ejemplo de configuración del "nombre del programa", el execcomando de Bash puede establecer el argumento cero con la -aopción. (Podríamos hacer lo mismo con Perl, o directamente con C, etc.)
Aquí mynamehay un simple programa en C que simplemente imprime su argumento cero, el nombre que se ve a sí mismo:
$ ./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
Fuente:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Pero, para responder las preguntas numeradas ...
(1 y 4) la ejecución sh somescriptejecutará lo shque sea que esté en su PATH, probablemente, /bin/shpero posiblemente algo así/usr/xpg4/bin/sh .
- Si es Bash, se ejecuta en modo POSIX, ya que ve el nombre
sh.
- Si es el shell Z o el shell Korn, también ve el nombre
sh, pero se ejecuta en modo "compatible con SH", que tiene como objetivo ser compatible con el shell Bourne y es sutilmente diferente al modo conforme a POSIX completo en ambos. .
- Podría ser el caparazón Almquist, un caparazón Bourne real, o algo más, por supuesto.
(2 y 5) La ejecución bash somescriptse ejecutará en el modo Bash normal (de nuevo, por supuesto, depende de lo que haya bashen su PATH).
(3) Aquí, el nombre del script se da directamente a la llamada del sistema en lugar del archivo del programa. El núcleo lee la línea hashbang y la usa para ejecutar el script.
(6) Este es el complejo. Es similar a (3), pero la llamada al sistema para iniciar el programa falla ( ENOEXEC (Exec format error)), ya que no hay una línea hashbang. Lo que sucede después depende de si la cáscara de la que se está ejecutando es en sí en modo POSIX. POSIX requiere que un shell compatible con POSIX se comporte de manera específica en respuesta a ENOEXEC. Sin embargo, hay cierto margen de maniobra en "un comando equivalente a tener un shell invocado", lo que significa que diferentes shells hacen cosas diferentes.
- El shell Bourne Again se vuelve a ejecutar en el mismo modo con el nombre del script como primer argumento de línea de comandos. En su modo compatible con POSIX, por supuesto se está ejecutando en su modo compatible con POSIX, obedeciendo así el requisito de POSIX para invocar un shell compatible con POSIX.
- El shell Z, el shell Almquist y el shell Korn se ejecutan
/bin/shcon el nombre del script insertado antes de los otros argumentos como su primer argumento de línea de comandos. El shell Z, el shell Almquist y el shell Korn están (intentando) invocar un shell compatible con POSIX a fuerza de suponer que el /bin/shprograma es uno.