Eu queria modificar meu PS1 para executar alguns comandos todas as vezes. Digamos que eu queira que, se o último comando executado for bem-sucedido, adicione um sorriso verde no final do PS1, caso contrário, o sorriso deve ser vermelho.
Eu extraí para uma função:
function exit_smile {
EXITSTATUS="$?"
RED="\[\e[1;31m\]"
GREEN="\[\e[32;1m\]"
if [ "${EXITSTATUS}" -eq 0 ]
then
SMILE="${GREEN}:)"
else
SMILE="${RED}:("
fi
echo -n "$SMILE"
}
e então tentou usar `exit_smile`
e \$(exit_smile)
ao modificar a variável PS1, mas a executa uma vez ao modificar o PS1 ou imprime literal \[\e...\]
em vez de uma cor.
Por exemplo
PROMPT="\u@\h \W"
PS1="${PROMPT} \$ \$(exit_smile) ${OFF}\n"
Dá username@hostname ~ $ \[\e[32;1m\]:)
O que estou perdendo?
Não tenho certeza se isso mudou entre as versões (*) , mas minha página de manual do Bash diz que
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 que o comando fosse executado. E não tenho ideia do que colocar\[..\]
dentro de uma substituição de comando faria ... Isso faria mais sentido de outra maneira por aí.)Portanto, teremos que colocar os códigos de cores em expansões separadas e protegê-las
\[..\]
manualmente. Vou usar variáveis em vez de substituição de comando e também a$'...'
expansão para obter o caractere ESC:(* a razão pela qual me pergunto sobre isso é que as respostas para a pergunta mais antiga e semelhante, mas não tão duplicada, parecem produzir o
\[..\]
de dentro de uma expansão)