标题应该说明一切。我正在寻找与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
来源失败($0
为zsh
),echo
输出一个空行。
编辑: 显然,要使除非你设置$0
生效,我需要设置选项FUNCTION_ARGZERO
。有没有办法测试是否在脚本中设置了这个? (这样我就可以暂时设置它了)nofunction_argzero
,否则它显然是打开的,它在我的shell中打开。 $0
仍然没有得到任何结果。 (我想b / c我不是一个职能部门。)
答案 0 :(得分:38)
${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]
中获取。