gpt4 book ai didi

bash - 在 $0 和 BASH_SOURCE 之间选择

转载 作者:行者123 更新时间:2023-11-29 08:39:14 24 4
gpt4 key购买 nike

如何在 "$0""${BASH_SOURCE[0]}" 之间做出选择

此描述来自 GNU对我帮助不大。

    BASH_SOURCE

An array variable whose members are the source filenames where the
corresponding shell function names in the FUNCNAME array variable are
defined. The shell function ${FUNCNAME[$i]} is defined in the file
${BASH_SOURCE[$i]} and called from ${BASH_SOURCE[$i+1]}

最佳答案

注意:对于符合 POSIX 的解决方案,请参阅 this answer .

${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]}$BASH_SOURCE :

Bash 允许您引用元素 0使用标量 表示法的数组 变量:而不是写${arr[0]} , 你可以写 $arr ;换句话说:如果你引用变量就好像它是一个标量,你会得到索引为0的元素。 .

使用此功能掩盖了 $arr 的事实是一个数组,这就是为什么流行的 shell-code linter shellcheck.net发出以下警告(截至撰写本文时):

SC2128: Expanding an array without an index only gives the first element.

附带说明:虽然此警告很有用,但它可能更准确,因为您不一定会得到 第一个 元素:它特别是索引 0 处的元素。那是返回的,所以如果第一个元素有更高的索引——这在 Bash 中是可能的——你会得到空字符串;尝试 a[1]='hi'; echo "$a" .
(相比之下,zsh,曾经的叛徒,将 所有 元素作为单个字符串返回,与第一个字符分隔。存储在 $IFS 中,这是一个 空格默认情况下)。

您可能会因为它的模糊性而选择避开此功能,但它可以预见地工作,而且从实用的角度来说,您很少(如果有的话)需要访问除 0 以外的索引数组变量 ${BASH_SOURCE[@]} .


可选阅读,第 2 部分:在什么条件下 BASH_SOURCE数组变量实际上包含多个元素?:

BASH_SOURCE只有多个条目如果涉及函数调用,在这种情况下它的元素平行于FUNCNAME包含所有函数名称的数组当前在调用堆栈上

也就是说,在函数内部,${FUNCNAME[0]}包含执行函数的名称,以及 ${BASH_SOURCE[0]}包含定义该函数的脚本文件的路径,${FUNCNAME[1]}包含调用当前正在执行的函数的函数的名称,如果适用,等等。

如果给定函数直接从脚本文件中的顶级作用域调用,该脚本文件在 $i 层定义函数调用堆栈,${FUNCNAME[$i+1]}包含:

  • main (伪函数名称),如果脚本文件被直接调用(例如,./script)

  • source (伪函数名称),如果脚本文件是 sourced(例如 source ./script. ./script)。

关于bash - 在 $0 和 BASH_SOURCE 之间选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35006457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com