我在 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
。在这些情况下,部分或全部输出可能会打印到终端,而不是标题。
在您的情况下, 中的第一个\e
会echo
中断终端标题的设置,之后的所有内容都会转到终端。也就是说,输出的第一部分 - 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
。