У меня есть сценарий, где я не хочу, чтобы он звонил exit
если это получается.
Я думал о проверке если $0 == bash
но это имеет проблемы, если сценарий получен из другого сценария, или если пользователь получает его от другой оболочки как ksh
.
Существует ли надежный способ обнаружить, если сценарий получается?
Кажется, это переносимо между Bash и Korn:
[[ $_ != $0 ]] && echo "Script is being sourced" || echo "Script is a subshell"
Строка, подобная этой, или присваивание вроде pathname = "$ _"
(с последующим тестом и действием) должна быть первой в строке сценария или в строке после shebang (которая, если она используется, должна быть для ksh, чтобы она работала в большинстве случаев).
Я не думаю, что есть какой-либо переносимый способ сделать это как в ksh, так и в bash. В bash вы можете обнаружить это с помощью вывода вызывающего
, но я не думаю, что в ksh есть аналог.
Если ваша версия 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 ..."
Это работает позже в сценарии и не зависит от переменной _:
## 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
Я хотел бы предложить небольшую поправку к очень полезному ответу Денниса , чтобы сделать его немного более портативным, я надеюсь:
[ "$_" != "$0" ] && echo "Script is being sourced" || echo "Script is a subshell"
потому что [[
не распознается (несколько анально сохраняющейся IMHO) оболочкой Debian POSIX , тире
. Кроме того, кавычки могут понадобиться для защиты от имен файлов, содержащих пробелы, опять же в указанной оболочке.