${ BASH_SOURCE [0]}等效于 zsh?

标题应该说明一切。我正在寻找一个等价于 zsh 中的 ${BASH_SOURCE[0]}

注意: 我一直在因特网上发现“ $0等价于 ${BASH_SOURCE[0]}”,但这似乎是错误的: $0似乎是执行命令的名称。(这是 argv[0],这是有道理的。)在我的脚本中回显 $0(.zshrc)给出了 zsh对于 $0的值,这与 ${BASH_SOURCE[0]}的值是不一样的。事实上,除了在 .zshrc文件中,${BASH_SOURCE[0]}似乎在 zsh中工作。

我在 .zshrc中真正在做的事情(不起作用) :

echo ${BASH_SOURCE[0]}
source `dirname $0`/common-shell-rc.sh

源失败($0zsh) ,echo输出一个空行。

编辑: 显然,为了 ABC0的工作,我需要选项 FUNCTION_ARGZERO选项集。有什么方法可以测试这是否在脚本中设置?(以便我可以暂时设置它)它显然是打开的,除非你设置为 nofunction_argzero,并且它在我的 shell 中是打开的。$0还是一无所获。(我想 b/c 我不在函数中。)

28800 次浏览

$0是正确的。在源脚本中,这是一个脚本的名称,因为它被传递给了内置的 .source(因此,如果设置了 path_dirs选项,您可能需要进行 $path查找来找到脚本的实际位置)。

.zshrc没有来源,这解释了为什么 $0没有设置为 .zshrc。不管怎样,你知道文件名和位置: 它是 ${ZDOTDIR-~}/.zshrc

也许你在找 $_

# foo.sh
source foo2.sh

还有

# foo2.sh
echo $_

产量

# ./foo.sh
foo2.sh

在 zsh 中等效的 ${BASH_SOURCE[0]}${(%):-%N},而不是 $0(正如 OP 所说,后者在.zhrc 中失败)

这里的 %表示值的提示扩展, %N表示“脚本名称、源文件名称、, 或者 zsh 当前正在执行的 shell 函数,

如果没有,则等效于参数 $0。”(来自 man zshmisc)

如果您是符号链接到。在 dotfiles 目录中的 zhrc 文件,并希望引用该目录中的其他文件,然后尝试这样做:

SOURCE=${(%):-%N}
while [ -h "$SOURCE" ]; do
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DOTFILES_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

(我从 给你得到了循环脚本。)

${(%):-%x} 是最接近于 bash$BASH_SOURCE(和 ksh${.sh.file})-没有 $0zsh

他的回答中提供关键的指针和背景信息的惠政,我们向他致敬。

它返回封闭 剧本的(潜在相对)路径,

  • 不管脚本是否为 来源
    • 具体来说,它还可以在诸如 ~/.zshrc之类的初始化/概要文件中工作(与 $0不同,$0会莫名其妙地返回 Shell的路径)。
  • 不管是否从脚本中定义的 功能内部调用(与 $0不同,$0返回函数内部的 功能名称)。

我发现与 $BASH_SOURCE的唯一不同之处在于下面这个模糊的场景——甚至可能是一个 bug (在 zsh 5.0.5中观察到) : 在源代码中的函数 嵌套在另一个函数中中,当嵌套函数被调用(再次) 回见之后已经被源代码调用(返回任何值或者‘ zsh’)时,${(%):-%x}返回封闭的脚本路径。


关于 ${(%):-%x}的背景资料 :

  • (%):-代替参数(变量)展开(${...})中的变量名,使转义序列可用,这些转义序列通常用于表示 提示字符串中的环境信息,例如在 PS1变量中用于确定显示为主交互提示的字符串。

    • %是一个参数扩展标志的实例,所有这些参数都在 man zshexpn中标题 Parameter Expansion Flags下面列出。
  • %x是可以在提示字符串中使用的转义序列之一,它的功能如上所述; 还有更多的转义序列,比如用于表示当前目录的 %d

    • man zshmisc在标题 SIMPLE PROMPT ESCAPES下列出了所有可用的序列。

如果希望脚本兼容 bash 和 zsh,可以使用 ${BASH_SOURCE[0]:-${(%):-%x}}。结果值在定义时取自 BASH_SOURCE[0],在未定义 BASH_SOURCE[0]时取自 ${(%):-%x}}