该脚本可以检测“bash somescript”和“bash -c 'source somescript'”之间的差异吗?

该脚本可以检测“bash somescript”和“bash -c 'source somescript'”之间的差异吗?

看看(之前的)标题,它很有可能被标记为“重复”。

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.shsource与单独的 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 而不是当前目录中的PATHa 。test.sh

采购(“.”或“源”)和在 bash 中执行文件有什么区别?有关在当前 shell 中获取脚本时的差异的详细信息。

相关内容