¿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
sh
script de shell (Dash o equivalente), no, no hay diferencia externa.El problema es
.run
que 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
chmod
activarlo (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 ./script
ejecuta elsh
comando con un argumento./script
que ejecuta el script dado ... incluso si el script no es realmente unsh
script (incorrecto)./script
Ejecuta 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
filename
contiene 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
sh
obash
, esa línea se interpretará como un comentario y se ignorará, por lo que el-e
parámetro (salir en caso de falla) no se procesará. Entonces, dado el siguiente script:La salida para
./script
será solo "Hola", pero la salida parash script
seráHello
seguida porgoodbye
, lo que probablemente no fue intencionado.Por cierto, esta es la razón por la que siempre debe usar una
set -e
declaració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>.run
hace que el script sea ejecutable para que pueda ejecutarlo./<script>.run
.Con
[sudo] sh ./<script>.run
usted puede ejecutarlo, incluso si no es ejecutable.fuente