Как обнаружить, если сценарий получается

У меня есть сценарий, где я не хочу, чтобы он звонил exit если это получается.

Я думал о проверке если $0 == bash но это имеет проблемы, если сценарий получен из другого сценария, или если пользователь получает его от другой оболочки как ksh.

Существует ли надежный способ обнаружить, если сценарий получается?

185
задан codeforester 24 July 2018 в 07:26
поделиться

5 ответов

Кажется, это переносимо между Bash и Korn:

[[ $_ != $0 ]] && echo "Script is being sourced" || echo "Script is a subshell"

Строка, подобная этой, или присваивание вроде pathname = "$ _" (с последующим тестом и действием) должна быть первой в строке сценария или в строке после shebang (которая, если она используется, должна быть для ksh, чтобы она работала в большинстве случаев).

61
ответ дан 23 November 2019 в 05:52
поделиться

Я не думаю, что есть какой-либо переносимый способ сделать это как в ksh, так и в bash. В bash вы можете обнаружить это с помощью вывода вызывающего , но я не думаю, что в ksh есть аналог.

0
ответ дан 23 November 2019 в 05:52
поделиться

Если ваша версия Bash знает о переменной массива BASH_SOURCE, попробуйте что-нибудь вроде:

# man bash | less -p BASH_SOURCE
#[[ ${BASH_VERSINFO[0]} -le 2 ]] && echo 'No BASH_SOURCE array variable' && exit 1

[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "script ${BASH_SOURCE[0]} is being sourced ..."
150
ответ дан 23 November 2019 в 05:52
поделиться

Это работает позже в сценарии и не зависит от переменной _:

## Check to make sure it is not sourced:
Prog=myscript.sh
if [ $(basename $0) = $Prog ]; then
   exit 1  # not sourced
fi

или

[ $(basename $0) = $Prog ] && exit
4
ответ дан 23 November 2019 в 05:52
поделиться

Я хотел бы предложить небольшую поправку к очень полезному ответу Денниса , чтобы сделать его немного более портативным, я надеюсь:

[ "$_" != "$0" ] && echo "Script is being sourced" || echo "Script is a subshell"

потому что [[ не распознается (несколько анально сохраняющейся IMHO) оболочкой Debian POSIX , тире . Кроме того, кавычки могут понадобиться для защиты от имен файлов, содержащих пробелы, опять же в указанной оболочке.

4
ответ дан 23 November 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: