Différence entre + x et ./ <script> et sh ./ <script>


13

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

Réponses:


18

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.


1
Comme je l'ai dit dans la réponse olis: j'ai vérifié l'exécutable, je lance le shebang son / bin / sh donc c'est probablement bien, attendez et voyez si quelqu'un a d'autres informations, puis acceptez une réponse
user36976

7

Tant qu'il s'agit d'un shscript shell (Dash ou équivalent), non, il n'y a pas de différence extérieure.

Le problème n'est .runpas 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 chmodding (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.


Ah je ne savais pas que merci pour la réponse, je viens de vérifier l'exécutable que je lance le hash-bang est / bin / sh donc je pense que ça va
user36976

1

Les deux méthodes peuvent souvent agir de la même manière mais sont très différentes.

sh ./scriptexécute la shcommande avec un argument ./script, qui arrive à exécuter le script donné .. même si le script n'est pas réellement un shscript (mauvais)

./scriptexé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 filenamecontient 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

1

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 shou bash, cette ligne sera interprétée comme un commentaire et ignorée, de sorte que le -eparamè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 ./scriptsera simplement "Bonjour", mais la sortie de sh scriptsera Hellosuivie de goodbye, ce qui n'était probablement pas prévu.

C'est d'ailleurs pourquoi vous devriez toujours utiliser une set -einstruction 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é).


0

Non

[sudo] chmod +x ./<scrupt>.runrend le script exécutable pour que vous puissiez l'exécuter avec ./<script>.run.
Avec [sudo] sh ./<script>.runvous pouvez l'exécuter, même s'il n'est pas exécutable.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.