提问人:Thanatos 提问时间:3/28/2012 最后编辑:Thanatos 更新时间:8/12/2023 访问量:32403
${BASH_SOURCE[0]} 等值于 zsh?
${BASH_SOURCE[0]} equivalent in zsh?
问:
标题应该说明一切。我正在寻找相当于 zsh 的。${BASH_SOURCE[0]}
注意:我一直在互联网上找到“等同于”,但这似乎是错误的:似乎是执行命令的名称。(这是,这是有道理的。在我的脚本 () 中回显 $0 给出了 ,这与 is 不同。事实上,似乎可以在 中工作,除了内部文件。$0
${BASH_SOURCE[0]}
$0
argv[0]
.zshrc
zsh
$0
${BASH_SOURCE[0]}
${BASH_SOURCE[0]}
zsh
.zshrc
我在我的 .zshrc
中真正在做什么(不起作用):
echo ${BASH_SOURCE[0]}
source `dirname $0`/common-shell-rc.sh
源失败 ( is ) 并输出空行。$0
zsh
echo
编辑:显然,要使 除非您设置,否则它显然是打开的,并且它在我的外壳中打开。仍然一无所获.(我认为 b/c 我不在一个函数中。0 美元
起作用,我需要选项FUNCTION_ARGZERO
选项集。有什么方法可以测试它是否在脚本中设置?(这样我就可以临时设置了)nofunction_argzero
$0
答:
$0
是正确的。在源脚本中,这是脚本的名称,因为它被传递给 或内置(因此,如果设置了该选项,则可能需要进行查找以查找脚本的实际位置)。.
source
path_dirs
$path
.zshrc
没有来源,这解释了为什么不设置为 。无论如何,您都知道文件名和位置:它是 .$0
.zshrc
${ZDOTDIR-~}/.zshrc
评论
foo
source ./foo2
foo2
echo $0
./foo
./foo
$0
${BASH_SOURCE[0]}
./foo2
./foo2
#!/bin/zsh
foo
foo
zsh
(可能还有其他 shell)中,的值是源脚本,而不是调用方脚本。这不是它在 Bash 中的工作方式。所以在 zsh 中和在 Bash 中是一样的。$0
$0
${BASH_SOURCE[0]}
.zshrc
zsh
$0
$0
$0
.zshrc
$BASH_SOURCE
${(%):-%x}
$0
zsh
$BASH_SOURCE
~/.zshrc
$0
${(%):-%x}
也许你正在寻找 ?$_
# foo.sh
source foo2.sh
和
# foo2.sh
echo $_
收益 率
# ./foo.sh
foo2.sh
评论
${BASH_SOURCE:-$_}
$_
)
${BASH_SOURCE[0]}
zsh 中的等价物是 , NOT(正如 OP 所说,后者在 .zshrc 中失败了)${(%):-%N}
$0
这里表示对值的提示扩展,表示“脚本的名称、源文件、
或 zsh 当前正在执行的 shell 函数,%
%N
以最近开始的为准。如果没有,则等效于参数 $0。(从man zshmisc
)
评论
$BASH_SOURCE
%x
%N
${(%):-%x}
:-
${(%)%N}
readlink
readlink -f ${(%):-%N}
${${(%):-%x}:A:h}
如果要符号链接到 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 )"
(我从这里得到了循环脚本。
评论
${(%):-%x}
是最接近 的等价物 (和 's) - 不是 。zsh
bash
$BASH_SOURCE
ksh
${.sh.file}
$0
感谢 Hui Zheng 在他的回答中提供了关键的指针和背景信息。
它返回封闭脚本的(可能是相对的)路径,
- 无论脚本是否被获取。
- 具体来说,它还可以在初始化/配置文件中工作,例如(不像 ,它莫名其妙地返回 shell 的路径)。
~/.zshrc
$0
- 具体来说,它还可以在初始化/配置文件中工作,例如(不像 ,它莫名其妙地返回 shell 的路径)。
- 无论是否从脚本中定义的函数内部调用(与 不同,它返回函数内部的函数名称)。
$0
我发现与 $BASH_SOURCE
的唯一区别是在以下晦涩难懂的场景中 - 这甚至可能是一个错误(在 zsh 5.0.5 中观察到):在嵌套在源脚本中另一个函数中的函数中,${(%):-%x} 在稍后调用该嵌套函数时,${(%):-%x}
不会返回封闭的脚本路径,在获取后(返回 nothing 或 'zsh')。
背景资料:${(%):-%x}
(%):-
代替参数(变量)中的变量名称,扩展 () 使转义序列可用,这些转义序列通常用于在提示字符串中表示环境信息,例如在变量中用于确定显示为主要交互式提示的字符串。${...}
PS1
%
是参数扩展标志的一个实例,所有这些标志都列在标题下。man zshexpn
Parameter Expansion Flags
%x
是可以在提示字符串中使用的转义序列之一,其功能如上所述;还有更多,例如表示当前目录。%d
man zshmisc
列出标题 下的所有可用序列。SIMPLE PROMPT ESCAPES
评论
如果你想让你的脚本同时兼容 bash 和 zsh,你可以使用 .生成的值将从定义时和未定义时获取。${BASH_SOURCE[0]:-${(%):-%x}}
BASH_SOURCE[0]
${(%):-%x}}
BASH_SOURCE[0]
把它们放在一起,在 bash 和 zsh 中都有效:
SCRIPT_FILE_REL_PATH="${BASH_SOURCE[0]}"
if [[ "$SCRIPT_FILE_REL_PATH" == "" ]]; then
SCRIPT_FILE_REL_PATH="${(%):-%N}"
fi
SCRIPT_FILE_PATH="`realpath $SCRIPT_FILE_REL_PATH`"
SCRIPT_DIR="`dirname $SCRIPT_FILE_PATH`"
评论