Вероятной причиной такого поведения является то, что в вашем ~/.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
- в $commandline
.