Réponses:
Si tu utilises
sh ./<script>.run
/bin/sh
(généralement un shell Bourne) sera utilisé pour exécuter le script. Bien sûr, cela ne fonctionne que si le script est écrit pour le shell Bourne. Parfois, les scripts shell pour Linux nécessitent Bash au lieu du shell Bourne, donc cela peut ne pas fonctionner même s'il s'agit d'un script shell.
Si tu utilises
./<script>.run
le noyau regarde la ligne shebang pour découvrir quel programme utiliser pour exécuter le programme. Cela fonctionne donc même s'il s'agit d'un script Bash, Perl, Python ou d'un autre script.
C'est donc généralement la manière préférée d'exécuter un script.
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'aveuglette sh
, 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.
Les deux méthodes peuvent souvent agir de la même manière mais sont très différentes.
sh ./script
exécute la sh
commande avec un argument ./script
, qui arrive à exécuter le script donné .. même si le script n'est pas réellement un sh
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'utilise sh
(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:
#!/usr/bin/python
print "This is a Python script!"
..alors les deux commandes sont très différentes:
$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!
S'il n'y a pas de ligne de shebang, les deux sont les mêmes:
$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
Une différence importante est que votre ligne de hachage a des paramètres. Par exemple, si le script commence par
#!/bin/bash -e
... et vous l'exécutez en externe à l'aide de sh
ou bash
, 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:
#!/bin/bash -e
echo Hello
false
echo goodbye
La sortie de ./script
sera simplement "Bonjour", mais la sortie de sh script
sera Hello
suivie de goodbye
, 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é).