zshrc 中的 Zsh 错误替换错误

zshrc 中的 Zsh 错误替换错误

我的 .zhsrc 文件中有这个:

[[ -n "${key[Home]}"    ]]  && bindkey  "${key[Home]}"    beginning-of-line     

按键盘上的 Home 似乎确实会触发转到行首,因此它似乎可以工作,但是每当我在 vim 中编辑 .zshrc 并保存它时,SyntasticCheck zsh 都会报告“错误替换”错误。

这是我的错误还是语法检查器中的错误?

编辑回应评论:

不,当 Zsh 启动时我没有收到错误,并且是的,语法检查器说错误就在那一行。

$ sed -n /Home/l .zshrc
key[Home]=${terminfo[khome]}$
[[ -n "${key[Home]}"    ]]  && bindkey  "${key[Home]}"    beginning-o\
f-line$

编辑2. zsh -vn .zshrc 的输出

我将 .zshrc 文件清理为:

echo OK
[[ -n "${key[Home]}"    ]]  && bindkey  "${key[Home]}"    beginning-of-line
echo OK2

当我启动 shell 时,我看到 OK 和 OK2,没有显示错误。但这是 zsh -vn .zshrc 的输出

# /etc/zsh/zshenv: system-wide .zshenv file for zsh(1).
#
# This file is sourced on all invocations of the shell.
# If the -f flag is present or if the NO_RCS option is
# set within this file, all other initialization files
# are skipped.
#
# This file should contain commands to set the command
# search path, plus other important environment variables.
# This file should not contain commands that produce
# output or assume the shell is attached to a tty.
#
# Global Order: zshenv, zprofile, zshrc, zlogin

if [[ -z "$PATH" || "$PATH" == "/bin:/usr/bin" ]]
then
        export PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"
fi
echo OK
[[ -n "${key[Home]}"    ]]  && bindkey  "${key[Home]}"    beginning-of-line
.zshrc:2: bad substitution

编辑3

版本:zsh 5.0.7 (x86_64-pc-linux-gnu)

答案1

zsh这是5.1 中修复的一些旧版本中的错误。变更日志:

2015-07-15 巴顿·谢弗

  • 35799:Src/params.c:使用 NO_EXEC,解析参数下标表达式以正确平衡大括号,但不执行下标

据报道同一天。

使用这些版本,可以使用以下命令进行复制:

$ zsh -nc '${a[1]}'
zsh:1: bad substitution

据 称git bisect,该漏洞于 2011 年引入修复关联数组的类似问题提交中dfc26195c916d54163a3f0dd2eb159db2d974569,从zsh-4.3.12版本开始

更一般地说,zsh -n(或anyshell -n) 的 lint 代码能力相当有限,因为它没有运行代码,因此在某些代码的评估方式取决于事先运行的某些代码的区域中它不能做太多事情。

例如${a[1+]}对于数组无效,但对于散列则可以。不知道哪个zsh -n只是不抱怨。

它还可能给出误报,例如:

alias aslongas=while
aslongas whatever; do
  something
done

它抱怨这种意外,do因为它没有承认aslongas是 的别名while

相关内容