Problema de personalização de prompt com cláusula if

Problema de personalização de prompt com cláusula if

Recentemente ajustei um pouco meu PS1. O código da seguinte forma:

PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '

O caractere que falta é defontes nerde não importa na minha pergunta (assim como assemble_promptna função).

O problema que encontrei é um PS1 quebrado quando reduzo o tamanho da janela do terminal para o tamanho de um prompt (aproximadamente). Então parece ignorar a configuração do PS1 e definir o PS1 $apenas para caracteres (veja a captura de tela). Observe que, quando começo a digitar, ele simplesmente substitui meu prompt personalizado nesta ocasião.

PS1 enlouqueceu

Limitei o problema a uma cláusula if que adiciona o caractere "fail" se o comando anterior não tiver êxito. Se eu remover essa parte, tudo funcionará conforme o esperado.

Existe uma maneira de manter ifparte da cláusula, mas corrigir o problema de redefinição do PS1 quando o tamanho da janela é muito pequeno?

PS Eu uso rxvt-unicodecomo meu terminal, mas o problema persiste em todos os outros terminais também (testado xterm, st).

Responder1

Você provavelmente deseja incluir os códigos de controle do terminal para \[...\]informar ao Bash que eles não estão realmente imprimindo caracteres. Caso contrário, eles confundirão o shell ao tentar contar a largura do prompt.

Então use "\[\e[91m\]xxx\[\e[0m\]".

Demanual:

\[  Begin a sequence of non-printing characters. 
    This could be used to embed a terminal control sequence into the prompt.
\]  End a sequence of non-printing characters.

informação relacionada