注意:有关POSIX兼容解决方案,请参见此答案。
${BASH_SOURCE[0]}
(或更简单地说,$BASH_SOURCE
[1]
)在所有调用场景中都包含包含脚本的(可能是相对的)路径,尤其是在脚本源时,该路径也不适用$0
。
此外,正如查尔斯·达菲(Charles Duffy)所指出的,调用者$0
可以将其设置为任意值。
另一方面,如果不涉及命名文件,$BASH_SOURCE
则可以为空;否则为空。例如:
echo 'echo "[$BASH_SOURCE]"' | bash
以下示例说明了这一点:
剧本foo
:
#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0
是POSIX Shell规范的一部分,而BASH_SOURCE
顾名思义,它是Bash特定的。
[1] 可选阅读:${BASH_SOURCE[0]}
vs$BASH_SOURCE
:
击允许你参考元件0
的的阵列变量使用标量表示法:代替书写的${arr[0]}
,可以编写$arr
; 换句话说:如果您将变量当作标量来引用,则元素位于index处0
。
使用此功能可以掩盖$arr
一个数组的事实,这就是为什么流行的shell代码linter shellcheck.net发出以下警告的原因(截至撰写本文时):
SC2128:扩展没有索引的数组只会得到第一个元素。
附带说明:虽然此警告很有用,但它可能更精确,因为您不一定会获得第一个元素:特别0
是返回索引处的元素,因此,如果第一个元素具有更高的索引-在Bash中是可能的-您将获得空字符串;尝试一下'a[1]='hi'; echo "$a"'
。
(相比之下,zsh
,曾经的叛徒,确实不返回的第一个元素,不管其索引)。
您可能会因为其晦涩难懂而选择避开此功能,但是它可以预见地工作,并且从实用的角度来说,您几乎不需要访问数组变量以外的其他索引。0
${BASH_SOURCE[@]}
BASH_SOURCE
是在bash-3.0-alpha中添加的。您可能没有它,具体取决于您的测试方案。我在早期的Solaris和OS X上都找不到它。另请参见return:只能从 U&L.SE上的函数或源脚本中“返回”。