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

13

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

[sudo] sh ./<script>.run

вместо

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run
user36976
источник

Ответы:

18

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

sh ./<script>.run

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

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

./<script>.run

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

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

Флориан Диш
источник
1
Как я уже сказал в ответе Олиса: Я проверил исполняемый я бег хижины его / бен / ш так его , вероятно , хорошо, будет ждать и посмотреть , если у кого есть какая - либо другая информация , а затем принять ответ
user36976
7

Пока это sh(Dash, или эквивалентный) сценарий оболочки, нет, внешней разницы нет.

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

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

Оли
источник
Ах, не знал, что спасибо за ответ, только что проверил исполняемый файл, я запускаю hash-bang / bin / sh, так что я думаю, что это нормально
user36976
1

Эти два метода часто могут действовать одинаково, но очень разные.

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
DBR
источник
1

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

#!/bin/bash -e

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

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

Выход для ./scriptбудет просто «Привет», но выход за sh scriptбудет Helloзатем goodbye, что, вероятно , не предполагалось.

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

Луцкая
источник
0

нет

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

Pabi
источник