Uma razão provável para esse comportamento é que você tem algumas configurações em ~/.zshrc
que atualizam o título do terminal para conter a linha de comando atualmente em execução sem citar caracteres especiais, como \e
.
O mais provável é que a linha que realmente atualiza o título seja algo assim:
print -n -- "\e]2; $commandline \a"
Em vez de \e]2;
, também pode ser \e]0;
e, em vez de print -n
, pode ser echo -en
.
A parte importante é que este é o mesmo comando usado para imprimir no terminal, mas qualquer coisa entre \e]2;
e \a
(o caractere "bell") irá para o título do terminal em vez de ser impresso em o terminal.
Ou seja, a menos que $commandline
contenha alguns caracteres especiais, como \a
ou \e
. Nesses casos, uma parte ou toda a saída pode ser impressa no terminal em vez do título.
No seu caso, o primeiro \e
no echo
interrompe a configuração do título do terminal e depois disso vai para o terminal. Ou seja, a primeira parte de sua saída - xxx "
- vem de uma configuração com falha do título do terminal e a segunda parte - xxx
- é a saída real de echo
.
Para evitar esse comportamento, você precisa citar corretamente o que deseja enviar para o terminal como título.
No meu ~/.zshrc
eu tenho algo assim para definir o título do terminal depois de limpar a linha de comando:
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
Primeiro eu substituo qualquer espaço em branco por caracteres de espaço. Então faço com que caracteres não imprimíveis sejam visíveis. E, por último, cito todos os retrocessos restantes para evitar problemas com caracteres de escape - como \e
- em $commandline
.