Существуют ли реальные различия между выполнением скрипта с
[sudo] sh ./<script>.run
вместо
[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
command-line
chmod
user36976
источник
источник
Пока это
sh
(Dash, или эквивалентный) сценарий оболочки, нет, внешней разницы нет.Проблема
.run
не гарантирует, что это так. Это может быть двоичным. Это может быть Bash, Python, PHP или что-то еще; у всех них есть сценарий оболочки хэш-взрыва. Если вы слепо пробьетесьsh
, кто знает, что может произойти. Вероятно, произойдет ошибка, но он может случайно запустить вредоносный код, прежде чем зайти так далеко.По
chmod
динь это (для того, чтобы бит права выполнения) , а затем запустить его./script.run
, вы даете ему наилучшие возможности работы. Если это сценарий оболочки, его хэш-bang будет проанализирован должным образом, а если это исполняемый двоичный файл, он просто будет работать нативно.источник
Эти два метода часто могут действовать одинаково, но очень разные.
sh ./script
запускаетsh
команду с аргументом./script
, который выполняет данный сценарий .. даже если сценарий на самом деле не являетсяsh
сценарием (плохо)./script
выполняет данный файл. Это делается путем поиска строки «shebang», чтобы определить, какую команду запустить. Если он неsh
указан, он использует (иногда эти два метода действуют одинаково), но часто указывается другой интерпретатор.Например, если
filename
содержит следующее:..то две команды очень разные:
Если нет линии Шебанга, они совпадают:
источник
Одно важное отличие состоит в том, что ваша строка hashbang имеет параметры. Например, если скрипт начинается с
... и вы запускаете его извне, используя
sh
илиbash
, эта строка будет интерпретироваться как комментарий и игнорируется, поэтому-e
параметр (выход при ошибке) не будет обработан. Итак, учитывая следующий скрипт:Выход для
./script
будет просто «Привет», но выход заsh script
будетHello
затемgoodbye
, что, вероятно , не предполагалось.Именно поэтому, кстати, вам всегда следует использовать отдельное
set -e
утверждение (в любом случае, это хорошая идея - чаще всего, если в середине сценария возникает проблема, вы не хотите, чтобы ее игнорировали).источник
нет
[sudo] chmod +x ./<scrupt>.run
делает скрипт исполняемым , так что вы можете запустить его с./<script>.run
.С
[sudo] sh ./<script>.run
его помощью вы можете запустить его, даже если он не исполняемый.источник