我正在编写一个 bash 脚本,它需要在当前进程上运行才能发挥作用。
也就是说,我想确保脚本是通过source script.sh
或. ./script.sh
和调用的不是 ./script.sh
。
对于那些不知道区别的人,请参考以下内容: 执行 Bash 脚本与获取该脚本有什么区别?
我知道我可以chmod u-x script.sh
这样做,所以没有来源就无法执行,但用户可能会将其识别为脚本并chmod
自己识别。如果存在,我希望有一个更优雅的解决方案。
有没有办法让脚本识别出它尚未被调用source
或.
并因错误退出?
答案1
如果您的脚本由 提供bash
,那么$0
是bash
或-bash
:
[[ $0 =~ ^-?bash$ ]] && echo "Thank you for sourcing me"
或者,如果你知道你的脚本被调用了script.sh
,但是你不关心它可能来自哪个 shell,那么就反转测试:
[ "X$(basename -- "$0")" != "Xscript.sh" ] && echo "Thank you for sourcing me"
(请注意,由于以上内容适用于通用(POSIX)shell,因此它不使用[[
测试。)
有关相关问题的更多讨论,请参阅堆栈溢出。