Дополнительно
Как определить скрипт для быть получены не запустить
Я определяю сценарий оболочки, который пользователь должен источник
, а не казнить.
Есть обычный или интеллектуальный способ намекнуть пользователю, что это тот случай, например, через расширение?
Есть код оболочки я могу писать в сам файл, что приведет к его эхо-сообщение и выход, если он выполняется вместо источников, так что я могу избежать этой очевидной ошибки?
41
5
Предполагая, что вы используете Баш, поместите следующий код в начале скрипта, который вы хотите быть получены, но не исполнены:
Под Баш,
${BASH_SOURCE[0]}
будет содержать имя текущего файла, что оболочка-это значение, независимо от того, получены или казнены.В отличие от этого,
$0
- это имя текущего файла выполняется.-эф
тесты, Если эти два файла один и тот же файл. Если они есть, мы предупреждаем пользователя и выход.Ни
-эф", ни " BASH_SOURCE не в POSIX. В то время как
-эфподдерживается КШ, Яша, zsh и тире,
BASH_SOURCE требует Баш. ВЗШ
, однако,${BASH_SOURCE[0]}
можно заменить${(%):-%Н}
.Файл не является исполняемым, могут быть получены, но не исполнены, поэтому, в качестве первой линии обороны, не установив исполняемый флаг должен быть хороший намек...
Редактировать: я просто наткнулся на: сделайте такое быть любой исполняемый файл, что это'т интерпретатор командной строки,
/Бен/значение false
делает скрипт возвращает ошибку (ГС!=0)Существует несколько методов, предложенных в этот переполнение стека пост, из которых, мне понравилась функция на основе предложенного Wirawan Purwanto и МР.spuratic лучший:
Так что вы можете добавить в начало скрипта:
При условии, что это просто бесполезно, а не вредные, чтобы выполнить скрипт, вы можете добавить
в конце сценария.
возвращение
вне функции имеет ненулевой код возврата, если файл был произведен.Когда вы исходный shell-скрипт, линии shebang игнорируется. Поставив в недопустимом притон, вы можете предупредить пользователя, что скрипт был ошибочно исполнен:
Сообщение об ошибке будет таким:
(Произвольное) имя аргумента уже дает сильный намек, но сообщение об ошибке все равно это'Т 100% понятно. Мы можем исправить это с помощью утилиты script
источник этого сценария
, что находится где-то в свой "путь":Теперь сообщение об ошибке будет таким:
Сравнение с другими подходами
По сравнению с другими ответами, этот подход только требует минимальных изменений для каждого сценария (и имеет притон помогает при определение типа файла в редакторах и указывает оболочки диалект сценария, таким образом, есть даже преимущества). Недостатком является несколько непонятным сообщением об ошибке, или (один раз) добавлением другой скрипт.
Это не мешает явный вызов через Баш path/to/script.sh хотя (спасибо @Муру!).