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