BASH - personalizando o PS1 para executar um comando

2

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í-lo 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, em seguida, tentou usar ambos ' exit_smile ' (rodeado de backticks) e \$(exit_smile) ao modificar a variável PS1, mas o 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"

username@hostname ~ $ \[\e[32;1m\]:)
O que estou perdendo?

    
por Szymon 03.12.2017 / 23:05

1 resposta

2

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)

    
por 03.12.2017 / 23:36