使用 ansii 颜色的 Echo 使我的文本加倍(zsh,mac)

使用 ansii 颜色的 Echo 使我的文本加倍(zsh,mac)

我在 Mavericks 上使用 iTerm2。$TERM设置为xterm-256color。当我在命令行中打印此内容时:

echo -e "\e[0;36m xxx \e[0m"

控制台在发生错误时发出蜂鸣声并输出:

xxx "  xxx

以正确的颜色呈现。您知道我遗漏了什么吗?

答案1

出现这种行为的可能原因是您中的某些设置~/.zshrc会更新终端标题以包含当前运行的命令行而不引用特殊字符,例如\e

最有可能的是实际更新标题的行看起来像这样:

print -n -- "\e]2; $commandline \a"

\e]2;它也可能被取代\e]0;,并且print -n它也可能被取代echo -en

重要的是,这是用于打印到终端的相同命令,但是\e]2;\a(“bell”字符)之间的任何内容都会转到终端标题,而不是打印到终端中。

除非$commandline包含一些特殊字符,如\a\e。在这些情况下,部分或全部输出可能会打印到终端,而不是标题。

在您的情况下, 中的第一个\eecho中断终端标题的设置,之后的所有内容都会转到终端。也就是说,输出的第一部分 - xxx "- 来自终端标题的失败设置,而第二部分 - xxx- 是 的实际输出echo


为了防止这种行为,您需要正确引用要发送到终端的任何内容作为标题。

~/.zshrc我清理命令行后,我有类似这样的设置终端标题:

settermtitle () {
    # save the first argument in commandline if given, else use empty string
    local commandline="${1:-}"
    # remove special whitespaces (newline, tab, vertical tab, etc)
    commandline=$(print -nr -- "$cl" | tr "\n\t\v\f\r" " ")
    # quote print specials
    commandline=${(V)commandline}
    # quote backslashes
    commandline=${commandline//\\/\\\\}

    print -n -- "\e]2; iTerm2 - $commandline\a"
}

preexec_title () {
    settermtitle "$1"
}

add-zsh-hook preexec preexec_title

首先,我用空格字符替换所有空格。然后,我使不可打印的字符可见。最后,我引用所有剩余的反斜杠,以避免转义字符出现任何问题 - 例如\e- 在 中$commandline

相关内容