Si script.sh es solo algo típico como
#!/bin/bash
echo "Hello World!"
¿Hay alguna forma preferida de ejecutar el script? Creo que primero tienes que modificarlo para que se vuelva ejecutable.
Si script.sh es solo algo típico como
#!/bin/bash
echo "Hello World!"
¿Hay alguna forma preferida de ejecutar el script? Creo que primero tienes que modificarlo para que se vuelva ejecutable.
Respuestas:
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 se ejecutará /bin/bash
y pasará ./script.sh
como argumento de línea de comando.
bash script.sh
hace que su shell se ejecute bash
y pase script.sh
como argumento de línea de comandosEntonces, el sistema operativo se cargará bash
(sin siquiera mirarlo script.sh
, porque es solo un argumento de línea de comandos). El bash
proceso creado entonces interpretará el script.sh
porque se pasa como el argumento de la línea de comandos. Como script.sh
solo se lee bash
como un archivo normal, no se requiere el bit de ejecución.
Sin ./script.sh
embargo, recomiendo usar , porque es posible que no sepa qué intérprete requiere el script. Deje que el cargador de programas determine eso por usted.
. ./script.sh
no es lo mismo que bash script.sh
(o ./script.sh
. Considere el script #!/usr/bin/python -V
<newline> print test
.
. script.sh
. Pero estoy de acuerdo con las personas que desalientan el uso del .
comando en scripts que no están destinados a ser invocados de esa manera. Me sorprende que nadie mencione eso, si el script contiene exit
comandos, y lo obtiene, podría cerrar la sesión. Un problema menos grave sería si el script hace un cd
, ya que eso también afectaría el shell primario (interactivo).
bash script.sh
invoca el script directamente usando bash.
./script.sh
está usando el shebang #!/bin/bash
para determinar cómo ejecutar.
Si realmente quiere saber, qué binario se ejecuta si lo hace bash script.sh
, puede averiguarlo which bash
.
Entonces, en su ejemplo, no hay diferencia. Sí, chmod +x script.sh
debe poder ejecutarlo directamente a través de ./script.sh
.
/bin/bash
sea el primero bash
en tu $PATH
.
#!/bin/bash
solo funciona si hay un/bin/bash
./script.sh
.
Cree un archivo Delete_Self.sh como este:
#!/bin/rm
echo I am still here!
Ejecute este script ya sh Delete_Self.sh
que verá "¡Todavía estoy aquí!" repitió.
Conviértalo en ejecutable y ejecútelo, ya ./Delete_Self.sh
que verá que nada se repite, mientras que el archivo en Delete_Self.sh
sí no está.
Entonces la diferencia es que:
bash script.sh
ignorará el #! línea, porque bash se especifica como el programa para ejecutar script.sh../script.sh
leerá el #! línea para determinar el programa a ejecutar script.sh
.Además de las otras respuestas, es útil conocer la diferencia entre ejecutar un script a través de ./script.sh
(i) y la fuente ./script.sh
(ii): la versión (i) crea un nuevo shell para ejecutar el comando, mientras que (ii) lo ejecuta en el shell actual: que puede ser obligatorio si el ejecutable cambia las variables de entorno que deben conservarse después de que el ejecutable salga. Por ejemplo, para activar un entorno python conda se debe usar lo siguiente:
source activate my_env
NB Otra alternativa a la source
que puede encontrar es el .
incorporado, es decir
. activate my_env