PS1="\'if [ \$? = 0 ]; then ... fi\'
Update: So I tried the plain "$()" but it didn't work. And, now I am more puzzled because if add a forward slash to it works - "\$()".
O \
é uma barra invertida, não uma barra invertida.
Você precisa escapar do $
aqui pelo mesmo motivo que escapou dos backticks no primeiro snippet: porque senão a substituição do comando é expandida imediatamente , ao definir PS1
, e não quando PS1
é usado para produzir um prompt.
É melhor usar aspas simples ao redor da tarefa, elas evitam a expansão de variáveis e substituições de comando para toda a string.
PS1='$(if [ $? != 0 ]; then echo -e "\[\e[1;31m\][boom]\[\e[0m\] "; fi)\u@\h \w\$ '
Note que você precisa colocar os códigos de escape dentro de \[ ... \]
para dizer ao bash que eles não são impressos, e que eles não devem levá-los em consideração ao calcular a largura do prompt (mencionado de passagem no manual ). (Eu não sei se o Bash pode lidar corretamente com os personagens gráficos que você usou, e eu não posso testar.)