标题应该说明一切.我正在寻找与${BASH_SOURCE[0]}zsh 相当的东西.
注意:我一直在互联网上找到" $0等同于${BASH_SOURCE[0]}",但这似乎是错误的:$0似乎是执行命令的名称.(这是argv[0],这是有道理的.)在我的剧本呼应$ 0( .zshrc)给出zsh的$0,这是不一样的东西${BASH_SOURCE[0]}是.事实上,除了内部文件之外,${BASH_SOURCE[0]}似乎可以工作.zsh.zshrc
我真正在做什么.zshrc(那是行不通的):
echo ${BASH_SOURCE[0]}
source `dirname $0`/common-shell-rc.sh
Run Code Online (Sandbox Code Playgroud)
源失败($0是zsh),echo输出为空行.
编辑: 显然,为了除非你设置$0工作,我需要选项FUNCTION_ARGZERO选项集.有没有办法测试是否在脚本中设置了这个?(所以我可以暂时设置它)nofunction_argzero,它显然是打开的,它在我的shell中.仍然无济于事$0.(我想b/c我不是一个功能.)
Hui*_*eng 41
${BASH_SOURCE[0]}在zsh中的等价物是${(%):-%N},NOT $0(如OP所说,后者在.zshrc中失败)
这里%表示对值的快速扩展,
%N表示"zsh当前正在执行的脚本,源文件或shell函数的名称,
以最近开始的为准.如果没有,这相当于参数$ 0."(来自man zshmisc)
mkl*_*nt0 31
${(%):-%x}是最接近zsh相当于bash的$BASH_SOURCE(和ksh的${.sh.file}) - 没有 $0.
向郑铮提供的帽子提示,在他的回答中提供了关键的指针和背景信息.
它返回封闭脚本的(可能是相对的)路径,
~/.zshrc(不像$0,莫名其妙地返回shell的路径).$0,它返回函数内的函数名).
以唯一的区别$BASH_SOURCE我发现在以下晦涩的场景-这甚至有可能(在zsh中5.0.5观察)中的错误:在一个函数内嵌套另一个函数内部在执行的脚本,${(%):-%x}并没有返回时封闭脚本路径该嵌套函数被调用(再次)后,后已采购(收益存在或是"的zsh").
背景资料上${(%):-%x}:
(%):-代替参数(变量)中的变量名称expand(${...})使转义序列可用,通常用于表示提示字符串中的环境信息,例如在PS1变量中用于确定显示为主要交互式提示的字符串.
%是参数扩展标志的一个实例,所有这些都列在man zshexpn标题下Parameter Expansion Flags.%x是可以在提示字符串中使用的转义序列之一,它的功能如上所述; 还有更多,比如%d代表当前的目录.
man zshmisc列出标题下的所有可用序列SIMPLE PROMPT ESCAPES.dol*_*s3m 12
如果你想让你的脚本同时兼容 bash 和 zsh,你可以使用${BASH_SOURCE[0]:-${(%):-%x}}. 结果值将取BASH_SOURCE[0]它的定义时,并且${(%):-%x}}当BASH_SOURCE[0]没有定义。
Gil*_*il' 11
$0是正确的.在源脚本中,这是脚本的名称,因为它被传递给.或source内置(因此,如果path_dirs设置了该选项,则可能需要执行$path查找以查找脚本的实际位置).
.zshrc不是来源,这解释了为什么$0没有设置.zshrc.无论如何,你知道文件名和位置:它是${ZDOTDIR-~}/.zshrc.
Fra*_*ter 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 )"
Run Code Online (Sandbox Code Playgroud)
(我从这里得到了循环脚本.)