¿Hay alguna diferencia real entre ejecutar un script con
[sudo] sh ./<script>.run
en lugar de
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
command-line
chmod
usuario36976
fuente
fuente

Siempre que sea un
shscript de shell (Dash o equivalente), no, no hay diferencia externa.El problema es
.runque no garantiza que ese sea el caso. Podría ser binario. Podría ser Bash o Python o PHP o lo que sea; todos tienen un script de shell hash-bang. Si lo forzas ciegamentesh, quién sabe qué podría pasar. Probablemente se producirá un error, pero podría ejecutar accidentalmente código dañino antes de llegar tan lejos.Al
chmodactivarlo (para habilitar el bit de permiso de ejecución) y luego ejecutarlo./script.run, le brinda la mejor posibilidad de ejecución. Si es un script de shell, su hash-bang se analizará correctamente y si es un ejecutable binario, simplemente se ejecutará de forma nativa.fuente
Los dos métodos a menudo pueden actuar igual pero son muy diferentes.
sh ./scriptejecuta elshcomando con un argumento./scriptque ejecuta el script dado ... incluso si el script no es realmente unshscript (incorrecto)./scriptEjecuta el archivo dado. Lo hace buscando la línea "shebang" para determinar qué comando ejecutar. Si no se especifica, utilizash(a veces los dos métodos actúan igual), pero a menudo se especifica un intérprete diferente.Por ejemplo, si
filenamecontiene lo siguiente:..entonces los dos comandos son muy diferentes:
Si no hay una línea shebang, los dos son iguales:
fuente
Una diferencia importante es si su línea hashbang tiene parámetros. Por ejemplo, si el script comienza con
... y lo ejecuta externamente usando
shobash, esa línea se interpretará como un comentario y se ignorará, por lo que el-eparámetro (salir en caso de falla) no se procesará. Entonces, dado el siguiente script:La salida para
./scriptserá solo "Hola", pero la salida parash scriptseráHelloseguida porgoodbye, lo que probablemente no fue intencionado.Por cierto, esta es la razón por la que siempre debe usar una
set -edeclaración separada (de todos modos, es una buena idea; la mayoría de las veces, si hay un problema a mitad del script, no querrá que se ignore).fuente
No
[sudo] chmod +x ./<scrupt>.runhace que el script sea ejecutable para que pueda ejecutarlo./<script>.run.Con
[sudo] sh ./<script>.runusted puede ejecutarlo, incluso si no es ejecutable.fuente