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.
fuente
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.
Para su secuencia de comandos específica, de cualquier manera funcionará, excepto que ./script.shrequiere ejecución y bits legibles, mientras que bash script.shsolo 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/bashy pasará ./script.sh como argumento de línea de comando.
bash script.shhace que su shell se ejecute bashy pase script.shcomo 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 bashproceso creado entonces interpretará el script.shporque se pasa como el argumento de la línea de comandos. Como script.shsolo se lee bashcomo un archivo normal, no se requiere el bit de ejecución.
Sin ./script.shembargo, 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.shno es lo mismo quebash 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 contieneexitcomandos, y lo obtiene, podría cerrar la sesión. Un problema menos grave sería si el script hace uncd, ya que eso también afectaría el shell primario (interactivo).bash script.shinvoca el script directamente usando bash../script.shestá usando el shebang#!/bin/bashpara determinar cómo ejecutar.Si realmente quiere saber, qué binario se ejecuta si lo hace
bash script.sh, puede averiguarlowhich bash.Entonces, en su ejemplo, no hay diferencia. Sí,
chmod +x script.shdebe poder ejecutarlo directamente a través de./script.sh.fuente
/bin/bashsea el primerobashen tu$PATH.#!/bin/bashsolo funciona si hay un/bin/bash./script.sh.Cree un archivo Delete_Self.sh como este:
Ejecute este script ya
sh Delete_Self.shque verá "¡Todavía estoy aquí!" repitió.Conviértalo en ejecutable y ejecútelo, ya
./Delete_Self.shque verá que nada se repite, mientras que el archivo enDelete_Self.shsí no está.Entonces la diferencia es que:
bash script.shignorará el #! línea, porque bash se especifica como el programa para ejecutar script.sh../script.shleerá el #! línea para determinar el programa a ejecutarscript.sh.fuente
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:NB Otra alternativa a la
sourceque puede encontrar es el.incorporado, es decirfuente