Combine 2 prompts em um, mostrando a condição de erro em vermelho / laranja

4

Não é uma questão muito interessante, mas a resposta pode ser benéfica para muitos usuários. ; -)

Como todos, tenho um aviso personalizado. O meu fica vermelho para raiz e é verde para um usuário normal e algumas outras pequenas coisas:

Em bash.bashrc :

PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]\n\$ '

Em .bashrc :

PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

resultando em:

\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]\n\$

para um usuário normal ...

Esse é o máximo de minhas habilidades com prompts, mas um administrador realmente de alto nível compartilhou comigo o prompt:

PS1_Error="\[3[31;1m\]"
PS1_Normal="\[3[0m\]"
PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ '
PS1="\'
        retcode=\$? ;
        if [ 0 -ne \$retcode ]; then
                bad=\" [\\\\$?=\$retcode]\"
                echo \"$PS1_Error$PS1_Inside$PS1_Normal\"
        else
                bad='';
                echo \"$PS1_Inside\";
        fi;
\'"
unset PS1_Error PS1_Normal PS1_Inside

que tem a fantástica capacidade de ficar vermelho com um erro e mostra o número do erro !

Como eu sou burro demais para entender como isso funciona (as variáveis necessárias não estão definidas ???), eu definitivamente sou burro demais para incorporar esse ao meu (e eu gostaria de laranja por uma condição de erro ...)

Como o administrador de alto nível é um cara / garota / neutro muito ocupado, estou perguntando para a U & L se há alguém aqui que entenda o que foi mencionado acima e queira me ensinar como pescar em vez de dar me um peixe? me ajude a incorporar o bom PS1 no idiota e explique um pouco o que está acontecendo aqui?

    
por Fabby 19.04.2015 / 22:49

1 resposta

4

Essas variáveis descrevem o prompt em si:

PS1_Error="\[3[31;1m\]"
PS1_Normal="\[3[0m\]"
PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ '

As cores são feitas usando códigos de escape ANSI . 3 é o caractere de escape (33 = 27 octal), então [31;1m define a cor do texto 31 e o efeito 1. [0m define o efeito 0, ou seja, todos os valores padrão. Observe como PS1_Inside está em único citações ( '' ), isso significa que a substituição de variável não é executada nesta etapa. (Isso vai acontecer mais tarde.)

A mágica real acontece aqui:

PS1="\'
         ...
\'"

Isso define o PS1 como a saída da execução do código dentro dos caracteres '' . A expansão de variáveis acontecerá com o que vier a ocorrer. O código será executado toda vez que o prompt for exibido . O código em si é executado assim:

        retcode=\$? ;

$? contém o resultado do comando anterior. Zero significa OK, qualquer outra coisa é uma condição de falha. Isso é armazenado em retcode por enquanto. Tudo precisa ser escapado, porque queremos que as variáveis sejam acessadas quando o código é executado, e não substituídas no momento da definição.

        if [ 0 -ne \$retcode ]; then

Se não for zero, algo deu errado. Então, fazemos eco do estilo de prompt usado para erros. bad é usado em PS1_Inside acima. PS1_Error é usado para alterar a cor, PS1_Normal é usado para alterar a cor de volta ao normal.

                bad=\" [\\\\$?=\$retcode]\"
                echo \"$PS1_Error$PS1_Inside$PS1_Normal\"
        else

Nesse caso, nenhum erro ocorreu, por isso, não criamos nenhuma cor e emitimos apenas PS1_Inside . bad está definido como vazio, portanto, nada será exibido no prompt.

                bad='';
                echo \"$PS1_Inside\";
        fi;

Finalmente, as variáveis auxiliares não são configuradas para não atrapalhar o ambiente.

unset PS1_Error PS1_Normal PS1_Inside
    
por 19.04.2015 / 23:58

Tags