2

Я пишу bash-скрипт, который должен быть запущен в текущем процессе, чтобы он был полезным.

То есть я хочу убедиться, что скрипт был вызван с помощью source script.sh или . ./script.sh а не ./script.sh .

Для тех из вас, кто не знает разницу, обращайтесь к этому: в чем разница между выполнением сценария Bash и его поиском?

Я знаю , что могу сделать chmod u-x script.sh поэтому он не может быть выполнен без поиска, но пользователи могут могут распознавать его как сценарий и chmod самого. Я хотел бы более элегантное решение, если оно существует.

Есть ли способ для сценария распознать, что он не был вызван с source или . и выйти с ошибкой?

1 ответ1

1

Если ваш скрипт использует bash , то $0 это bash или -bash:

[[ $0 =~ ^-?bash$ ]] && echo "Thank you for sourcing me"

В качестве альтернативы, если вы знаете, что ваш скрипт называется script.sh но вам все равно, в какую оболочку он может быть получен, инвертируйте тест:

[ "X$(basename -- "$0")" != "Xscript.sh" ] && echo "Thank you for sourcing me"

(Обратите внимание, что, поскольку вышеизложенное относится к общим (POSIX) оболочкам, оно не использует [[ tests.]

Для более подробного обсуждения связанных вопросов см. StackOverflow.

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