Hash hostname em uma cor

6

Eu gosto de ter certeza de que estou logado no host certo por ter uma cor específica para cada host. Eu copio meu .bashrc para hosts diferentes e edito com uma cor diferente para cada um.

No entanto, eu não gostaria de ter que editar manualmente a cor em cada host, mas sim preencher automaticamente as cores do meu prompt bash em cada host, com uma distinta para cada nome de host.

Estou imaginando um comando em .bashrc que obtém o nome do host, transforma-o em uma cor exclusiva e define a cor de prompt bash.

Pergunta: Como posso colocar o nome do host em uma cor no bash?

Pode até fazer um julgamento sobre o conjunto de cores razoáveis com base na cor de fundo do terminal.

    
por Hatshepsut 13.09.2016 / 00:48

2 respostas

8

isso pode não ter uma cor "legal" com base no plano de fundo, mas deve funcionar, supondo que a cor de plano de fundo padrão seja sempre cor 0 :

tput setaf $(hostname | sum | awk -v ncolors=$(infocmp -1 | expand | sed -n -e "s/^ *colors#\([0-9][0-9]*\),.*//p") 'ncolors>1 {print 1 + ($1 % (ncolors - 1))}')

Para quebrar isso:

  • tput - imprime uma string de controle de terminal
  • setaf - a string de controle do terminal; nesse caso, set ANSI foreground
  • $(...) - substituição de comando BASH nestable para o parâmetro color
    • hostname - obter o nome do host
    • sum - calcula uma soma de verificação simples no nome do host
    • awk ...
    • -v ncolors=$(...) - configura a variável AWK ncolors para o valor da substituição do comando em $(...)
      • infocmp -1 - exibe as informações do terminal sobre o tipo de terminal atual com 1 parâmetro por linha
      • expand - expanda as guias para espaços para facilitar o script sed
      • sed -n -e "s/^ *colors#\([0-9][0-9]*\),.*//p" - extrai o valor da capacidade do terminal integer colors
    • 'ncolors>1 {...}' - o script awk, que executa o código {...} somente se ncolors for maior que 1
      • print 1 + ($1 % (ncolors - 1)) - pega o $1 absoluto (o campo 1 da entrada, que é proveniente de sum , que significa $1 é o valor da soma de verificação), localiza seu resto após ser dividido por (ncolors - 1) (que tem o efeito de limitá-lo ao intervalo 0 a (ncolors - 2) ), adicione 1 e imprima.
por 14.09.2016 / 15:43
3

Você pode estar interessado em context-color , que eu reuni com base na resposta da J Earls: link

É um script simples que, quando executado, gera uma cor com base no hash de uma saída de comando. Com ele instalado em algum lugar no seu $PATH , você poderia fazer algo assim em seu .bashrc :

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(onde --prompt/-p é o comutador para que a cor seja ignorada pelos prompts e \[\e[0m\] a seqüência de escape para redefinir a cor)

Por padrão, o comando usado para gerar o hash é whoami; hostname . Se você quiser apenas que a cor mude de acordo com o nome do host, poderá alterar o ambiente $CONTEXT variable ( export CONTEXT="hostname" ) ou simplesmente usar a opção --context/-c ( context-color -c "hostname" ).

Veja abaixo um exemplo:

    
por 15.03.2018 / 18:52