Answers:
这种行为的一个可能原因是你有一些设置~/.zshrc
更新终端标题以包含当前运行的命令行而不引用特殊字符,如\e
。
最有可能实际更新标题的行看起来像这样:
print -n -- "\e]2; $commandline \a"
而不是\e]2;
它也可能\e]0;
而不是print -n
它echo -en
。
重要的是,这是用于打印到终端的相同命令,但是\e]2;
和\a
(“铃”字符)之间的任何内容都将转到终端标题,而不是打印到终端。
这是除非$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
- in $commandline
。
printf "\e]1; $PWD:t:$(history $HISTCMD | cut -b7- ) \a"
in(post/pre)exec
function。