$ {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
源失败( $0
是zsh
), 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中的环境信息的转义序列,例如在PS1
variables中使用确定显示为主交互提示的string。-
%
是参数扩展标志的一个实例,所有这些都在man zshexpn
的Parameter Expansion Flags
标题下列出。
-
-
%x
是可以在提示string中使用的转义序列之一,它的function如上所述; 还有更多,比如%d
代表当前目录。-
man zshmisc
在SIMPLE 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