标题应该说明一切.我正在寻找与${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)
(我从这里得到了循环脚本.)