15

У меня есть скрипт, который завален вокруг моей файловой системы (побочный эффект процесса сборки), который устанавливает некоторые глобальные переменные среды (LD_LIBRARY_PATH, PATH, ROOTDIR и т.д.), Которые должны быть в моей оболочке для правильной работы. Конечно, это означает, что мне нужен source script.sh или . script.sh чтобы заставить его работать, а не ./script.sh (который породил бы новую оболочку и не установил бы переменные в моей текущей оболочке).

Могу ли я что-нибудь добавить в сценарий, чтобы предотвратить (или предупредить), что кто-то запускает ./script.sh ?

5 ответов5

11

В сценарии оболочки $0 - это имя текущего запущенного сценария. Вы можете использовать это, чтобы сказать, если у вас есть источник или работает так:

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    echo "Don't run $0, source it" >&2
    exit 1
fi
2

Самый простой способ в bash это:

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

$BASH_SOURCE всегда содержит имя / путь скрипта.

$0 содержит только имя / путь скрипта, когда НЕ поставлено.

Поэтому, когда они совпадают, это означает, что сценарий НЕ был получен.

1

Это обсуждалось на SO. Самый популярный ответ @barroyo говорит, что использовать

[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "script ${BASH_SOURCE[0]} is being sourced ..."
1

Другим вариантом может быть удаление разрешений на выполнение. В этом случае он не может быть выполнен, но он все еще может быть получен.

0

Создайте собственный интерпретатор source_reminder:

#!/bin/sh
printf "%s\n" "Source me!" >&2
exit 1

Не забудьте сделать его исполняемым. Затем просто используйте его в своем исполняемом скрипте:

#!/path/to/your/source_reminder
foo
bar
whatever

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .