Другой способ - вызвать интерпретатор и передать ему путь к скрипту:
/bin/sh /path/to/script
Точка и источник эквивалентны. (РЕДАКТИРОВАТЬ: нет, это не так: как указывает KeithB в комментарии к другому ответу, «.» Работает только в оболочках, связанных с bash, где «source» работает как в оболочках, связанных с bash, так и csh.) Он выполняет сценарий в -place (как будто вы скопировали и вставили скрипт прямо там). Это означает, что все функции и нелокальные переменные в скрипте остаются. Это также означает, что если скрипт вставит компакт-диск в каталог, вы все равно будете там, когда это будет сделано.
Другие способы запуска скрипта будут запускать его в своей собственной оболочке. Переменные в скрипте еще не живы, когда это сделано. Если скрипт изменил каталоги, то это не влияет на среду вызова.
/ path / to / script и / bin / sh script немного отличаются. Как правило, в начале скрипта есть «шебанг», который выглядит так:
#! /bin/bash
Это путь к интерпретатору сценария. Если он указывает на интерпретатор, отличный от того, который вы делаете при его выполнении, он может вести себя по-другому (или вообще не работать).
Например, сценарии Perl и сценарии Ruby начинаются с (соответственно):
#! /bin/perl
а также
#! /bin/ruby
Если вы запустите один из этих сценариев /bin/sh script
, то они не будут работать вообще.
Ubuntu на самом деле не использует оболочку bash, но очень похожую, называемую dash. Скрипты, которые требуют bash, могут работать немного неправильно при вызове, /bin/sh script
потому что вы только что вызвали bash-скрипт, используя интерпретатор dash.
Еще одно небольшое отличие между непосредственным вызовом сценария и передачей пути сценария интерпретатору заключается в том, что сценарий должен быть помечен как исполняемый для непосредственного запуска, а не для запуска путем передачи пути к интерпретатору.
Еще один незначительный вариант: вы можете использовать любой из этих способов выполнения скрипта с помощью eval, так что вы можете иметь
eval sh script
eval script
eval . script
и так далее. На самом деле это ничего не меняет, но я подумал, что включу это для тщательности.