Ответы:
Если вы используете
sh ./<script>.run
/bin/sh
(обычно оболочка Bourne) используется для запуска скрипта. Конечно, это работает, только если скрипт написан для оболочки Bourne. Иногда сценарии оболочки для Linux требуют Bash вместо оболочки Bourne, поэтому это может не сработать, даже если это сценарий оболочки.
Если вы используете
./<script>.run
ядро просматривает строку shebang, чтобы узнать, какую программу использовать для запуска программы. Так что это работает, даже если это Bash, Perl, Python или какой-либо другой скрипт.
Таким образом, обычно это предпочтительный способ запуска скрипта.
Пока это sh
(Dash, или эквивалентный) сценарий оболочки, нет, внешней разницы нет.
Проблема .run
не гарантирует, что это так. Это может быть двоичным. Это может быть Bash, Python, PHP или что-то еще; у всех них есть сценарий оболочки хэш-взрыва. Если вы слепо пробьетесь sh
, кто знает, что может произойти. Вероятно, произойдет ошибка, но он может случайно запустить вредоносный код, прежде чем зайти так далеко.
По chmod
динь это (для того, чтобы бит права выполнения) , а затем запустить его ./script.run
, вы даете ему наилучшие возможности работы. Если это сценарий оболочки, его хэш-bang будет проанализирован должным образом, а если это исполняемый двоичный файл, он просто будет работать нативно.
Эти два метода часто могут действовать одинаково, но очень разные.
sh ./script
запускает sh
команду с аргументом ./script
, который выполняет данный сценарий .. даже если сценарий на самом деле не является sh
сценарием (плохо)
./script
выполняет данный файл. Это делается путем поиска строки «shebang», чтобы определить, какую команду запустить. Если он не 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
Одно важное отличие состоит в том, что ваша строка hashbang имеет параметры. Например, если скрипт начинается с
#!/bin/bash -e
... и вы запускаете его извне, используя sh
или bash
, эта строка будет интерпретироваться как комментарий и игнорируется, поэтому -e
параметр (выход при ошибке) не будет обработан. Итак, учитывая следующий скрипт:
#!/bin/bash -e
echo Hello
false
echo goodbye
Выход для ./script
будет просто «Привет», но выход за sh script
будет Hello
затем goodbye
, что, вероятно , не предполагалось.
Именно поэтому, кстати, вам всегда следует использовать отдельное set -e
утверждение (в любом случае, это хорошая идея - чаще всего, если в середине сценария возникает проблема, вы не хотите, чтобы ее игнорировали).