Zsh返回`<function>:<linenumber> = not found`

时间:2017-06-03 07:36:38

标签: zsh

我使用了以下tmux快捷方式功能在一个单独的脚本中定义并使用别名,它工作得很好但是很乱。我决定将它移到我自然所属的.zshrc,并遇到一个我无法弄清楚的问题。

function t () {re='^[0-9]+$'
if [ "$1" == "kill" ]
then
        tmux kill-session -t $2
elif [[ "$1" =~ "$re" ]]
then
        tmux attach-session -d -t $1
fi}

我来源.zshrc,调用该函数,然后获取:

t:1: = not found

我知道函数已定义:

╭─bennett@Io [~] using
╰─○ which t
t () {
    re='^[0-9]+$'
    if [ "$1" == "kill" ]
    then
            tmux kill-session -t $2
    elif [[ "$1" =~ "$re" ]]
    then
            tmux attach-session -d -t $1
    fi
}

我假设这是抱怨函数的第一行。我已经尝试将函数的第一行向下移动几行,除了错误消息所指的行之外,它不会改变任何内容。有什么线索是怎么回事?我在SO上找不到与此特定问题相关的任何内容。

2 个答案:

答案 0 :(得分:2)

命令[(或test)仅支持单个=来检查两个字符串是否相等。使用==会导致出现“= not found”错误消息。 (见man 1 test

zsh内置[主要是出于兼容性原因。它试图在可能的情况下实现POSIX,这可能带来所有的怪癖(See the Zsh Manual)。

除非您需要脚本符合POSIX(例如,为了与其他shell兼容),我强烈建议使用条件表达式,即[[ ... ]],而不是[ ... ]。它具有更多功能,不需要引号或其他可能为空值的变通方法甚至允许使用算术表达式。

答案 1 :(得分:0)

将第一个条件包装在第二组方括号中似乎解决了这个问题。

有关单支架和双支架的更多信息,请点击此处: Is [[ ]] preferable over [ ] in bash scripts?