Существуют ли какие-либо реальные различия между запуском сценария с
[sudo] sh ./<script>.run
вместо
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
Если Вы будете использовать
sh ./<script>.run
/bin/sh
(обычно, то Оболочка Bourne) будет используемый для выполнения сценария. Конечно, это только работает, если сценарий записан для Оболочки Bourne. Иногда сценарии оболочки для Linux требуют Bash вместо Оболочки Bourne, таким образом, это не может работать, даже если это - сценарий оболочки.
, Если Вы используете
./<script>.run
, ядро смотрит строка хижины для обнаружения который программа использовать для запущения программы. Таким образом, это работает, даже если это - Bash, Perl, Python или некоторый другой сценарий.
Таким образом это обычно - предпочтительный способ выполнить сценарий.
Никакой
[sudo] chmod +x ./<scrupt>.run
делает исполняемый файл сценария, таким образом, можно выполнить его с ./<script>.run
.
С [sudo] sh ./<script>.run
можно выполнить его, даже если это не исполняемый файл.
Одно важное различие - то, если Ваша hashbang строка имеет параметры. Например, если сценарий запускается с
#!/bin/bash -e
... и Вы выполняете его внешне использование sh
или bash
, та строка будет интерпретироваться как комментарий и игнорироваться, таким образом, -e
параметр (выход при отказе) не будет обработан. Так, учитывая следующий сценарий:
#!/bin/bash -e
echo Hello
false
echo goodbye
Вывод для ./script
будет просто "Привет", но вывод для sh script
будет Hello
сопровождаемый goodbye
, который не был, вероятно, предназначен.
Это, между прочим, то, почему необходимо всегда использовать отдельное set -e
оператор (это - хорошая идея так или иначе - как правило, если бы существует проблема середина сценария, Вы не хотели бы, чтобы это было проигнорировано).
Пока это sh
(Тире, или эквивалентно) сценарий оболочки, нет, нет никакого исходящего различия.
проблема .run
, не гарантирует, что это имеет место. Это могло быть двоичным. Это мог быть Bash или Python или PHP или безотносительно; у них всех есть удар хеша сценария оболочки. Если Вы вслепую вызываете его до sh
, кто знает то, что могло произойти. Это будет, вероятно, ошибка, но это могло случайно выполнить вредный код прежде, чем получить это далеко.
chmod
звон это (для включения бита полномочий выполнения) и затем выполнение его ./script.run
Вы даете ему самую лучшую возможность выполнения. Если это будет сценарий оболочки, его удар хеша будет проанализирован правильно и если это будет двоичный исполняемый файл, это будет просто работать исходно.
Эти два метода могут часто действовать то же, но очень отличаются.
sh ./script
выполнения эти sh
команда с аргументом ./script
, который, оказывается, выполняет данный сценарий.. даже если сценарий не на самом деле sh
, сценарий (плохо)
./script
выполняет данный файл. Это делает это путем поиска "хижина" строка для определения что команду работать. Если неуказанный это использует sh
(это эти два действия методов то же иногда), но часто различный интерпретатор определяется..
, Например, если filename
содержит следующее:
#!/usr/bin/python
print "This is a Python script!"
.. тогда две команды очень отличаются:
$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!
, Если нет никакой строки хижины, эти два являются тем же:
$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script