Спасибо за весь вклад. Я постараюсь ответить на свой вопрос сейчас и предоставлю полное руководство по различным возможностям выполнения скриптов и двоичных файлов. Пожалуйста, отредактируйте и прокомментируйте, и мы сможем придумать что-то полное и правильное. Вот мое предложение:
Сначала два пункта, чтобы заявить:
Linux различает команду и путь . Команда набирается только как есть на приглашение, и будет выполнять встроенный или заставит Linux искать соответствующий двоичный файл или скрипт на $ PATH.
Чтобы Linux интерпретировал что-то как путь, он должен содержать хотя бы одну косую черту (/). Например ./myScript
, это ./
может показаться излишним - это только для того, чтобы Linux интерпретировал его как путь, а не как команду.
Итак, варианты выполнения двоичного файла или скрипта:
Выполнение двоичного файла binary
:
$ binary # when 'binary' is on the PATH, or is a built-in
$ ./binary # when 'binary' is not on the path but in the current directory
$ /home/me/binary # when 'binary' is not on the PATH, and not in the current dir
Выполнение скрипта script
:
Файл должен иметь разрешения на выполнение, если не указано иное.
$ script # execute a script that is on PATH. Will be executed in a new shell.
# The interpreter to use is determined by the she-bang in the file.
$ ./script # execute a script that is in the current dir. Otherwise as above.
$ /a/dir/script # when the script is not on the PATH and not in current dir.
# Otherwise as above.
$ . script # execute a script in the current dir. Will be executed in the
# current shell environment.
$ source script # equivalent to the above *1
$ sh script # executes 'script' in a new shell *2 (the same goes for 'bash ...',
# 'zsh ...' etc.). Execute permission not neccessary.
О челки :
Скрипты с меткой (например #!/bin/sh
) в первой строке указывают, какой интерпретатор использовать.
- Этот интерпретатор будет использоваться при выполнении
./script
или с помощью команды: script
( script
должен быть в PATH)
- Использование
sh script
будет игнорировать ее и использовать в этом случае sh
в качестве переводчика
- Использование
. script
или source
игнорирует she-bang и использует текущий интерпретатор (поскольку .
или source
эквивалентно просто выполнению каждой строки сценария в текущей оболочке)
Сноски
* 1: Это только почти верно. В Баш они действительно та же команда, но при использовании source
, script
будет искать в $ PATH до текущей директории. Это bash, но в оболочках только для POSIX, source
не работает, но .
работает. Поэтому лучше использовать последний для мобильности.
* 2: в действительности мы запускаем двоичный sh с аргументом 'script', что заставит 'sh' выполнить 'скрипт' в его новой оболочке