bash script.sh vs ./script.sh vs #shebang


2

Suponiendo que ahora estoy en un shell bash y ejecuto lo siguiente

[me@server]$ bash script.sh

q1) ¿Se ha creado un nuevo proceso de bash secundario para ejecutar el script?

Si hago un

[me@server]$ ./script.sh

q2) ¿Se ha creado un nuevo proceso de bash secundario para ejecutar el script?

q3) ¿Cuál es la diferencia entre los 2 métodos entonces?


Respuestas:


1

De la explicación de barra diagonal

La diferencia que haces es

con sh, está ejecutando un programa que funcionará interpret the lines in your scripttal como lo habría escrito en el indicador interactivo del terminal,

con ./ estás haciendo un acceso directo suponiendo que el script está justo aquí en el directorio actual en el que estás sentado Y será ejecutable (porque, por ejemplo, emitiste chmod + x myscript.sh),

Información adicional de esta respuesta:

Para su secuencia de comandos específica, de cualquier manera funcionará, excepto que ./script.sh requiere ejecución y bits legibles, mientras que bash script.sh solo requiere bits legibles.

La razón de la diferencia de requisitos de permisos radica en cómo se carga el programa que interpreta su script:

./script.sh hace que su shell ejecute el archivo como si fuera un ejecutable normal. El shell se bifurca y usa una llamada al sistema (por ejemplo, execve) para hacer que el sistema operativo ejecute el archivo en el proceso bifurcado. El sistema operativo verificará los permisos del archivo (por lo tanto, se debe establecer el bit de ejecución) y reenviará la solicitud al cargador del programa, que observa el archivo y determina cómo ejecutarlo. En Linux, los ejecutables compilados comienzan con un número mágico ELF, mientras que los scripts comienzan con un #. (hashbang) Un encabezado hashbang significa que el archivo es un script y debe ser interpretado por el programa que se especifica después del hashbang. Esto permite que un script mismo le diga al sistema cómo interpretar el script.

Con su script, el cargador del programa ejecutará / bin / bash y pasará ./script.sh como argumento de la línea de comandos.

bash script.sh hace que su shell ejecute bash y pase script.sh como argumento de la línea de comandos Por lo tanto, el sistema operativo cargará bash (sin siquiera mirar script.sh, porque es solo un argumento de línea de comandos). El proceso bash creado entonces interpretará el script.sh porque se pasa como argumento de la línea de comandos. Debido a que script.sh solo es leído por bash como un archivo normal, no se requiere el bit de ejecución.


0
  1. un proceso de bash infantil es crear
  2. igual que el anterior (debido a shebang)
  3. los dos son equivalentes, si no desea bifurcar a un niño, o si desea mantener el valor de env script.sh, use

    . ./script.sh

cuidado sin embargo

  • si la script.shllamada sale, saldrá del shell actual.
  • Si el shell finaliza sin error, volverá al shell inicial.

. scriptes lo mismo que source script- ver help source(en bash prompt) para más.
Hannu
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.