在zsh中等价$ {BASH_SOURCE [0]}?

时间:2012-03-28 04:33:41

标签: shell zsh

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

注意:我一直在互联网上发现“$0等同于${BASH_SOURCE[0]}”,但这似乎是错误的:$0似乎是执行命令的名称。 (这是argv[0],这是有意义的。)在我的脚本(.zshrc)中回复$ 0会为zsh提供$0,这与${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。有没有办法测试是否在脚本中设置了这个? (这样我就可以暂时设置它了)除非你设置nofunction_argzero,否则它显然是打开的,它在我的shell中打开。 $0仍然没有得到任何结果。 (我想b / c我不是一个职能部门。)

6 个答案:

答案 0 :(得分:38)

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

此处%表示对值的快速扩展, %N表示“脚本的名称,源文件, 或者zsh当前正在执行的shell函数,

最近开始的那个。如果没有,则相当于参数$ 0.“(来自man zshmisc

答案 1 :(得分:24)

${(%):-%x} 是距离zsh bash {和$BASH_SOURCE&#39最近的ksh ; s ${.sh.file}) - $0

向Hui Zheng提供关于his answer中关键指针和背景信息的提示。

它返回封闭脚本的(可能是相对的)路径,

  • 无论脚本是否来源
    • 具体来说,它也适用于初始化/配置文件文件,例如~/.zshrc(与$0不同,后者莫名其妙地返回 shell 的路径)。 / LI>
  • 无论是否从脚本中定义的函数内部调用(与$0不同,后者在函数内返回函数名称)。< / LI>

我发现的$BASH_SOURCE的唯一区别在于以下模糊的情况 - 甚至可能是一个错误(在zsh 5.0.5中观察到):在函数内部嵌套在另一个函数中在源脚本中,${(%):-%x} not 返回封闭的脚本路径时,再次调用该嵌套函数 之后 >已被采购(不返回任何内容或&#39; zsh&#39;)。 功能


${(%):-%x}上的

背景信息

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

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

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

答案 2 :(得分:10)

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

.zshrc未获取,这解释了为什么$0未设置为.zshrc。无论如何,您知道文件名和位置:它是${ZDOTDIR-~}/.zshrc

答案 3 :(得分:10)

如果您在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 )"

(我从here获得了循环脚本。)

答案 4 :(得分:2)

也许您正在寻找$_

# foo.sh
source foo2.sh

# foo2.sh
echo $_

产量

# ./foo.sh
foo2.sh

答案 5 :(得分:1)

如果要使脚本与bash和zsh兼容,则可以使用${BASH_SOURCE[0]:-${(%):-%x}}。定义后,结果值将从BASH_SOURCE[0]中获取,而当${(%):-%x}}未定义时,结果将从BASH_SOURCE[0]中获取。