Cadeia PS1 colorida

1

Esclarecimento: Eu quero que __foo seja executado toda vez que a string PS1 for apresentada no terminal, não quando a string PS1 for construída (por isso, ela está entre aspas). __foo contém lógica que examina o diretório atual, portanto, sua execução deve ser adiada.

Estou tentando usar cores diferentes na minha string Bash PS1 de dentro de uma função Bash:

LIGHTRED="3[1;31m"
LIGHTGREEN="3[1;32m"
RESET="3[m"

__foo () {
    # Do some stuff and genereate a string to echo in different colours:
    echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1='$(__foo '$LIGHTRED' '$LIGHTGREEN')\['$RESET'\] \$'

Essencialmente eu quero que __foo gere parte do PS1 em um monte de cores diferentes. Minha tentativa parece não funcionar, no entanto; produz a seguinte saída:

-bash: 31m: command not found
-bash: 32m: command not found
\[]firstcolour \[\]secondcolour $

O que dá e como posso corrigir isso?

    
por Will Vousden 17.09.2012 / 22:04

3 respostas

2

Use a variável de ambiente Bash $ PROMPT_COMMAND para redefinir a variável $ PS1 antes de o prompt ser exibido.

LIGHTRED='3[1;31m'
LIGHTGREEN='3[1;32m'
RESET='3[m'

__foo () {
  # Do some stuff and genereate a string to echo in different colours:
  echo -n "\[$1\]firstcolour \[$2\]secondcolour"
}

PROMPT_COMMAND=$PROMPT_COMMAND'; PS1="$(__foo $RED $GRN)\[$OFF\]\n\$ "'

Note que duas alterações adicionais que fiz no seu código são opcionais aqui. Eles foram adicionados porque eu acho que isso esclarece onde / onde os códigos de escape não são expandidos:

  • Aspas duras ' em torno das variáveis de definição de cores.
  • Aspas suaves " ao redor da string de retorno para __foo
por 17.09.2012 / 23:56
1

Sua função foo retorna uma string que é executada por bash como um comando, desde que você o cercou com $() (e escapou de todas as substituições de variáveis com aspas simples.

Mudar seu código para isso faz com que funcione bem:

LIGHTRED="3[1;31m"
LIGHTGREEN="3[1;32m"
RESET="3[m"

__foo () {
  # Do some stuff and genereate a string to echo in different colours:
  echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1=$(__foo $LIGHTRED $LIGHTGREEN)\[$RESET\]\$
    
por 17.09.2012 / 22:51
0

Eu resolvi isso:

LIGHTRED="3[1;31m"
LIGHTGREEN="3[1;32m"
RESET="3[m"

__foo () {
    # Do some stuff and genereate a string to echo in different colours:
    echo -n '\['$1'\]firstcolour \['$2'\]secondcolour'
}

PS1='$(__foo "'$LIGHTRED'" "'$LIGHTGREEN'")\['$RESET'\] \$'

Os argumentos para __foo precisam ser colocados entre aspas.

    
por 17.09.2012 / 23:43

Tags