$ {BASH_SOURCE }等价于zsh?

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

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

我真的在我的.zshrc (这是行不通的):

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

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

编辑: 显然,为$0工作,我需要选项FUNCTION_ARGZERO选项设置。 任何方式来testing这是否在脚本中设置? (这样我可以暂时设置它)显然,除非你设置nofunction_argzero ,并且它在我的shell中。 $0仍然没有得到。 (我认为B / C我不在function。)

在zsh中相当于${BASH_SOURCE[0]}${(%):-%N} ,而不是$0 (如OP所说,后者在.zshrc中失败)

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

以最近开始的时间为准。 如果没有,则相当于参数$ 0。“(来自man zshmisc

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

.zshrc不是源代码,这就解释了为什么$0没有设置为.zshrc 。 无论如何你都知道文件名和位置:它是${ZDOTDIR-~}/.zshrc

${(%):-%x}是等同于bash$BASH_SOURCE (和ksh${.sh.file} ) – 不是 $0的最接近的zsh

提供关键指针和背景信息在回答中的提示 。

它返回封闭脚本的(潜在的相对)path,

  • 无论脚本是否来源
    • 具体地说,它也可以在~/.zshrc这样的初始化/configuration文件里面工作(不像$0 ,这会在那里无形中返回shell的path)。
  • 不pipe是否从脚本中定义的函数内部调用(不同于$0 ,它在函数内返回函数名称)。

我发现$BASH_SOURCE的唯一区别是在下面的模糊的情况下 – 甚至可能是一个错误(在zsh 5.0.5中观察到):在一个源代码脚本中嵌套在另一个函数中的函数 ${(%):-%x}不会返回封装的脚本path,当这个嵌套的函数稍后被调用(再次)时,返回(没有返回任何东西或'zsh')。


${(%):-%x} 背景信息

  • (%):-代替参数(variables)扩展( ${...} )中的variables名,可以使用通常用于表示提示string中的环境信息的转义序列,例如在PS1variables中使用确定显示为主交互提示的string。

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

    • man zshmiscSIMPLE PROMPT ESCAPES标题下列出所有可用的序列。

如果你在一个dotfiles目录中链接到.zshrc文件,并想引用目录中的其他文件,那么试试这个:

 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 )" 

(我从这里得到了循环脚本。)

也许你正在寻找$_

 # foo.sh source foo2.sh 

 # foo2.sh echo $_ 

产量

 # ./foo.sh foo2.sh