Personalizando o shell bash: Negrito / cor do comando

13

Existem vários tutoriais / publicações on-line (por exemplo, http://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/ ) sobre como personalizar seu prompt no bash, definindo PS1. Existe uma maneira de personalizar a cor / negrito do comando digitado?

Em outras palavras, como exemplo, digamos que eu queria um prompt verde, um comando azul em negrito e, em seguida, a saída em qualquer cor que fosse padrão. No exemplo abaixo, eu já sei " joe>" mostrar como verde, azul, negrito, qualquer que seja a configuração PS1. Mas existe uma maneira de git statusmostrar como ousado, por exemplo?

joe> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
...
jlarson
fonte
Se você quiser realmente um bom shell você deve usar zsh, o que você quer alcançar haveria muito simples compreexec() { printf '\e[0m' }
bollovan
3
@bollovan - 'Realmente bom' é um pouco subjetivo, acho realmente detestável por causa de seu inchaço e descumprimento do POSIX. Mas, o que quer que flutue no seu barco.
Chris Baixo
O inchaço do ChrisDown flutua no seu barco - nunca o ouvi, muito divertido.
N611x007

Respostas:

13

Você teria que deixar uma cor após o PS1 (inicie-a depois >no seu exemplo) e, em seguida, use a DEBUGarmadilha do bash para limpar a cor antes que seu comando fosse executado (mas depois de pressionar enter no seu shell. Tente algo como isto :

shopt -s extdebug
trap "tput sgr0" DEBUG
Chris Down
fonte
para alguém estranho escapar dos códigos: isso preservaria a cor original do comando (por exemplo, seria ls --color=alwayscolorido)?
N611x007
@naxa - Sim, pois isso define explicitamente os códigos de cores (exceto as cores coloridas na cor padrão do terminal, que só terão efeito após a primeira cor).
Chris Baixo
Esse truque parece interferir na conclusão da guia (imprime coisas estranhas como ^[(B^[[m). Porém, acontece apenas em alguns sistemas: testei isso em dois sistemas, ambos executando o Ubuntu 12.04 LTS, e apenas um deles teve a interferência.
Musiphil
7

Para garantir a integridade, veja como definir uma cor de prompt e a cor de entrada da linha de comando no bash. Coloque essas linhas no seu .bashrc.

PS1='\[\e[1;34m\]\w\$ \[\e[0;32m\]'
trap 'printf \\e[0m' DEBUG

A interceptação DEBUG, conforme sugerido por Chris Down , é usada para redefinir os atributos de texto. Destina-se à depuração, mas também é útil executar o código antes de executar o comando digitado pelo usuário .

Na configuração do prompt:

  • \[…\] é usado em torno das seqüências de escape para dizer ao bash que eles não usam nenhum espaço na tela (sem eles, a tela fica distorcida quando o bash precisa redesenhar o prompt).
  • \e[…monde é um número ou, geralmente, uma sequência de números separados por ponto e vírgula, é uma sequência de escape enviada ao terminal para afetar a cor e outros atributos do texto a seguir. Por exemplo, 1;34define negrito azul; 0;32redefine todos os atributos e muda a cor para verde. Ajuste a gosto.
  • \w\$imprima o diretório atual e $ou #. É claro que você pode alterar isso para o que quiser e inserir alterações nos atributos de texto, se quiser.
  • Há uma alteração final de atributo no final, que define a cor da entrada de texto.
Gilles 'SO- parar de ser mau'
fonte
FYI, códigos de cores bash / sequências podem ser consultados aqui: misc.flogisoft.com/bash/tip_colors_and_formatting
Kaiwan
0

Estou apenas aprendendo sobre os comandos do BASH e estou aqui sentado, brincando com os comandos de cores da minha versão. Eu descobri esta solução:

Usando este comando:

PS1='\[\e[0:36m\]\h>\[\e[0;31m\]'

Desconstruir: PS1 =: inicia o comando PS1

'': contém o comando entre aspas simples (para que o BASH não pense que é um comando para ele)

\: cada comando individual começa com este

[]: contém cada comando

\ e (também pode ser \ 033 um caractere de escape ASCII): inicia um comando de cor

O comando color precede o que ele se aplica.

[\ e [0; 36m]: ciano

\ h: nome do host

'>': impresso após o nome do host

[\ e [0; 31m]: vermelho

Aparentemente, o comando vermelho no final torna a entrada vermelha. Basta alterar as cores ao seu gosto e é isso que você está procurando.

Além disso, este site me ajudou um pouco:

https://www.linuxnix.com/linuxunix-shell-ps1-prompt-explained-in-detail/

Minha versão: GNU bash, v. 4.2.46

Cuidar,

Doninha

Doninha
fonte