¿Es posible evaluar previamente un valor en PS1 de bash?

Intento crear un prompt Bash que contenga tanto la información de mi git branch (usando __git_ps1 del bash-completion de git) como un smiley de color para indicar si el command de ejecución más reciente fue exitoso.

El smiley se crea usando esta técnica, que encontré aquí en SO:

SMILEY="${GREEN}:)${COLOR_NONE}" FROWNY="${RED}:(${COLOR_NONE}" STATUS_EMOTICON="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi" 

Aquí está la línea de aviso que quiero usar:

 export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${GREEN}\$(__git_ps1 ' %s')${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ " 

Desafortunadamente, parece que los progtwigs que son ejecutados por __git_ps1 anulan los $? valor, y termino con cada emoticon siendo un smiley verde, incluso después de ejecutar false .

Tomando la llamada __git_ps1 …

 export PS1="[\t]${RED}[\u@$MACHINE:${BOLD_CYAN}\w${RED}]${COLOR_NONE} \`${STATUS_EMOTICON}\`\n$ " 

… hace que el emoticón funcione correctamente.

Entonces, lo que aparentemente necesito hacer es evaluar ${STATUS_EMOTICON} antes de ejecutar __git_ps1 , pero include el valor evaluado después del resultado de __git_ps1 . ¿Es eso posible?

No coloque $(cmd) o `cmd` directamente en su PS1 . En su lugar, use la PROMPT_COMMAND de Bash var. Lo que suelo hacer es definir una function _PS1_cmd y establecer PROMPT_COMMAND=_PS1_cmd . Luego, en _PS1_cmd , configuré misc var que me gustaría include en PS1 . Por ejemplo:

 THE-OLD-PROMPT # cat prompt.rc function _PS1_cmd() { local saveExit=$? # This non-zero exit will not affect $? on command line g_git_ps1=$( echo TESTING; exit 1 ) if (( saveExit )); then g_smiley=':(' else g_smiley=':)' fi # Seems like this is not necessary, at least with bash 4.2.37. But # to be safe, always return it. return $saveExit } PROMPT_COMMAND=_PS1_cmd PS1='$g_git_ps1 $g_smiley ' THE-OLD-PROMPT # source ./prompt.rc TESTING :) ( exit 123 ) TESTING :( echo $? 123 TESTING :) echo $? 0 TESTING :)