A questão está aqui:
PS1='...\[$ALERT_COLOR\]$exit_status ...\$ '
^^
Isso é uma expansão de parâmetro, ele não chama a função que você configurou.
Você precisa chamar a função dentro de uma substituição de comando, por exemplo $(exit_status)
ou de PROMPT_COMMAND
. Se você fizer isso, tome cuidado com o \[ .. \]
escapes: O Bash os interpreta antes de outras expansões no prompt, então você tem que codificá-los na string de prompt (eles não podem ser partes de variáveis ou outras coisas expandidas no prompt).
E se não expandir o prompt de escape de variáveis parece para trás para você, não posso culpá-lo. Mas é assim que é documentado :
In addition, the following table describes the special characters which can appear in the prompt variables
PS1
toPS4
: [...] After the string is decoded, it is expanded via parameter expansion, command substitution, [...]
Algo como isso deve funcionar:
normal_color=$'3[00m'
red_color=$'3[41m'
exit_color=$normal_color
set_exit_color() {
if [ "$?" != 0 ]; then
exit_color=$red_color
else
exit_color=$normal_color
fi
}
PROMPT_COMMAND=set_exit_color
PS1='\[$exit_color\][$?]\[$normal_color\] \w\$ '
Eu teria pensado que precisaria de uma variável temporária para manter o status de saída, mas aparentemente PROMPT_COMMAND
não modifica o valor de $?
que é expandido no prompt. Se chamar a função com uma substituição de comando de dentro da cadeia de prompt, você precisará de uma solução alternativa, pois o código de saída da substituição de comando entrará em vigor. Algo assim:
normal_color=$'3[00m'
red_color=$'3[41m'
exit_color=$normal_color
exit_color() {
exit_code=$?
if [ "$exit_code" != 0 ]; then
echo "$red_color"
else
echo "$normal_color"
fi
return "$exit_code"
}
PS1='\[$(exit_color)\][$?]\[$normal_color\] \w\$ '
Eu usaria a versão com PROMPT_COMMAND
, apenas para salvar o fork do subshell causado pela substituição do comando, mas na prática o efeito é mínimo.