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