Existe-t-il des différences réelles entre l'exécution d'un script avec
[sudo] sh ./<script>.run
au lieu de
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
command-line
chmod
user36976
la source
la source
Tant qu'il s'agit d'un
sh
script shell (Dash ou équivalent), non, il n'y a pas de différence extérieure.Le problème n'est
.run
pas de garantir que c'est le cas. Ce pourrait être binaire. Ce pourrait être Bash ou Python ou PHP ou autre; ils ont tous un hash-bang de script shell. Si vous le forcez à l'aveuglettesh
, qui sait ce qui pourrait arriver. Cela entraînera probablement une erreur, mais il pourrait accidentellement exécuter du code nuisible avant d'aller aussi loin.En le
chmod
ding (pour activer le bit de permission d'exécution) puis en l'exécutant./script.run
, vous lui donnez la meilleure possibilité possible de s'exécuter. S'il s'agit d'un script shell, son hash-bang sera analysé correctement et s'il s'agit d'un exécutable binaire, il fonctionnera simplement en mode natif.la source
Les deux méthodes peuvent souvent agir de la même manière mais sont très différentes.
sh ./script
exécute lash
commande avec un argument./script
, qui arrive à exécuter le script donné .. même si le script n'est pas réellement unsh
script (mauvais)./script
exécute le fichier donné. Il le fait en recherchant la ligne "shebang" pour déterminer la commande à exécuter. S'il n'est pas spécifié, il l'utilisesh
(les deux méthodes agissent parfois de la même manière), mais souvent un interpréteur différent est spécifié.Par exemple, si
filename
contient les éléments suivants:..alors les deux commandes sont très différentes:
S'il n'y a pas de ligne de shebang, les deux sont les mêmes:
la source
Une différence importante est que votre ligne de hachage a des paramètres. Par exemple, si le script commence par
... et vous l'exécutez en externe à l'aide de
sh
oubash
, cette ligne sera interprétée comme un commentaire et ignorée, de sorte que le-e
paramètre (exit on failure) ne sera pas traité. Donc, étant donné le script suivant:La sortie de
./script
sera simplement "Bonjour", mais la sortie desh script
seraHello
suivie degoodbye
, ce qui n'était probablement pas prévu.C'est d'ailleurs pourquoi vous devriez toujours utiliser une
set -e
instruction distincte (c'est une bonne idée de toute façon - le plus souvent, s'il y a un problème au milieu du script, vous ne voudriez pas qu'il soit ignoré).la source
Non
[sudo] chmod +x ./<scrupt>.run
rend le script exécutable pour que vous puissiez l'exécuter avec./<script>.run
.Avec
[sudo] sh ./<script>.run
vous pouvez l'exécuter, même s'il n'est pas exécutable.la source