Разница между + x и ./<script> и sh ./<script>

Существуют ли какие-либо реальные различия между запуском сценария с

[sudo] sh ./<script>.run

вместо

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
13
задан 25 June 2014 в 00:09

5 ответов

Если Вы будете использовать

sh ./<script>.run

/bin/sh (обычно, то Оболочка Bourne) будет используемый для выполнения сценария. Конечно, это только работает, если сценарий записан для Оболочки Bourne. Иногда сценарии оболочки для Linux требуют Bash вместо Оболочки Bourne, таким образом, это не может работать, даже если это - сценарий оболочки.

, Если Вы используете

./<script>.run

, ядро смотрит строка хижины для обнаружения который программа использовать для запущения программы. Таким образом, это работает, даже если это - Bash, Perl, Python или некоторый другой сценарий.

Таким образом это обычно - предпочтительный способ выполнить сценарий.

18
ответ дан 25 June 2014 в 00:09

Никакой

[sudo] chmod +x ./<scrupt>.run делает исполняемый файл сценария, таким образом, можно выполнить его с ./<script>.run.
С [sudo] sh ./<script>.run можно выполнить его, даже если это не исполняемый файл.

0
ответ дан 25 June 2014 в 00:09

Одно важное различие - то, если Ваша hashbang строка имеет параметры. Например, если сценарий запускается с

#!/bin/bash -e

... и Вы выполняете его внешне использование sh или bash, та строка будет интерпретироваться как комментарий и игнорироваться, таким образом, -e параметр (выход при отказе) не будет обработан. Так, учитывая следующий сценарий:

#!/bin/bash -e
echo Hello
false
echo goodbye

Вывод для ./script будет просто "Привет", но вывод для sh script будет Hello сопровождаемый goodbye, который не был, вероятно, предназначен.

Это, между прочим, то, почему необходимо всегда использовать отдельное set -e оператор (это - хорошая идея так или иначе - как правило, если бы существует проблема середина сценария, Вы не хотели бы, чтобы это было проигнорировано).

1
ответ дан 25 June 2014 в 00:09

Пока это sh (Тире, или эквивалентно) сценарий оболочки, нет, нет никакого исходящего различия.

проблема .run, не гарантирует, что это имеет место. Это могло быть двоичным. Это мог быть Bash или Python или PHP или безотносительно; у них всех есть удар хеша сценария оболочки. Если Вы вслепую вызываете его до sh, кто знает то, что могло произойти. Это будет, вероятно, ошибка, но это могло случайно выполнить вредный код прежде, чем получить это далеко.

chmod звон это (для включения бита полномочий выполнения) и затем выполнение его ./script.run Вы даете ему самую лучшую возможность выполнения. Если это будет сценарий оболочки, его удар хеша будет проанализирован правильно и если это будет двоичный исполняемый файл, это будет просто работать исходно.

7
ответ дан 25 June 2014 в 00:09

Эти два метода могут часто действовать то же, но очень отличаются.

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
1
ответ дан 25 June 2014 в 00:09

Другие вопросы по тегам:

Похожие вопросы: