看看(之前的)标题,它很有可能被标记为“重复”。
test.sh
我有一个不带任何参数的脚本 ( )。我用以下两种方式称呼它:
bash "test.sh"
# BASH_ARGC=()
# BASH_ARGV=()
bash -c "source test.sh"
# BASH_ARGC=([0]="1" [1]="0")
# BASH_ARGV=([0]="test.sh")
# BASH_EXECUTION_STRING='source test.sh'
我发现的唯一区别是这三个 bash 变量。由于 test.sh 不接受任何参数,因此我认为这些差异是无关紧要的。
还有其他差异吗?
换句话说,什么 (in test.sh
) 可以在一个调用方法中工作,但不能在另一个调用方法中工作?
更新1
@JdeBP,@Stephen Kitt
感谢您的回答,但我的观点不是关于detection
差异,而是关于可能影响普通程序员的真正差异。
$0 的不同很少被普通程序员“使用”。
答案1
bash -c "source test.sh"
是一种有点不寻常的运行方式test.sh
,source
与单独的 shell 相结合。
这可以通过查看来检测$0
;典型的形式是
if [ "${0##*/}" = "test.sh" ]; then
# being run directly
else
# being sourced
fi
因为在涉及$0
时不会反映脚本。source
test.sh
除了参数处理之外,从的角度来看,两者之间不应该有任何实际差异
bash test.sh
和
bash -c "source test.sh"
然而,后一种形式更喜欢test.sh
上的a 而不是当前目录中的PATH
a 。test.sh
看采购(“.”或“源”)和在 bash 中执行文件有什么区别?有关在当前 shell 中获取脚本时的差异的详细信息。