Não tenho certeza se isso mudou entre as versões (*) , mas minha página de manual para Bash diz que
Bash allows these prompt strings to be customized by inserting a number of backslash-escaped special characters that are decoded as follows:
(list contains
\e
,\[
,\]
etc.)After the string is decoded, it is expanded via parameter expansion, command substitution, ...
O que significa que o \[..\]
não pode vir da substituição do comando, mas deve estar lá antes disso.
(Isso também significa que você poderia usar \u
ou \w
como argumentos para uma substituição de comando, e eles seriam substituídos antes do comando ser executado. E eu não tenho idéia do que colocar \[..\]
dentro de uma substituição de comando fazer ... Isso faria mais sentido ao contrário.)
Então, teremos que colocar os códigos de cores em expansões separadas e protegê-los com \[..\]
à mão. Usarei variáveis em vez de substituição de comando e também a expansão $'...'
para obter o caractere ESC:
prompt_smile() {
if [ "$?" = 0 ] ; then
smile=' :) '
smilecolor=$'\e[1;32m'
else
smile=' :( '
smilecolor=$'\e[1;31m'
fi
normalcolor=$'\e[0m'
}
PROMPT_COMMAND=prompt_smile
PS1='\u@\h \W \$ \[$smilecolor\]$smile\[$normalcolor\]\n'
(* o motivo pelo qual me pergunto é que as respostas para as respostas mais antigas e semelhante, mas nenhuma pergunta duplicada parece produzir o \[..\]
de dentro de uma expansão)