Bash string PS1 que avalia determinado código toda vez que é procurada

0

Esta questão é muito semelhante a esta: Cadeia PS1 colorida

Mas ainda não entendi completamente.

Então diga que eu tenho essa função

function getjobs {
    echo $(jobs | wc -l)
}

E meu PS1 é esse

PS1="\u@\h: [jobs "
PS1="$PS1\$(if [[ $(getjobs) == 0 ]] ; then
               echo $(color $green);
            else
               echo $(color $red);
            fi)"

Agora isso só é avaliado quando o .bashrc é carregado pela primeira vez, mas o que eu quero que aconteça é esta declaração se avaliada toda vez que um novo prompt aparecer.

Como posso fazer isso?

EDIT: a função color retorna seqüências de escape para essas cores.

    
por Adam Keenan 08.03.2013 / 06:15

3 respostas

0

Eu costumo usar algo assim:

method_that_echos_values(){
    if [[ ]]; then
      echo -n "something"
    else
      echo -n "something else"
    fi
}

export PS1="\$(method_that_echoes_values)"

Note que é necessário extraí-lo para um método

    
por 08.03.2013 / 06:30
1

Eu usaria o PROMPT_COMMAND do bash para isso. Veja a página do manual bash e esta resposta para um exemplo.

    
por 08.03.2013 / 08:07
0

Então, eu estava fazendo mais experimentos com diferentes posicionamentos de citações diferentes e descobri algo que funciona, mas se alguém souber uma solução mais limpa e melhor, avise-nos.

PS1="\u@\h: [jobs "
PS1="$PS1\$(if [[ "'$(getjobs)'" == 0 ]] ; then
           echo $(color $green);
        else
           echo $(color $red);
        fi)"

Tudo o que eu tive que fazer foi colocar a parte que eu queria reavaliado entre aspas simples com todo o resto entre aspas duplas. Eu não achei que funcionaria, já que eu tinha uma string dupla ao lado de uma única string citada, mas eu acho que é uma coisa boa.

    
por 08.03.2013 / 06:24