Dica: Mágica do Prompt

Aprimorando o Prompt do Sistema

Por que manter-se fiel à linha de comando do shell entediante quando é possível tornar isso colorido e mais informativo? Nessa dica, Daniel Robbins mostrará como obter sua linha de comando do shell simplesmente da maneira que você gosta, bem como a forma de atualizar dinamicamente sua barra de título do terminal X.

Daniel RobbinsGentoo Technologies

Residindo em Albuquerque, Novo México, Daniel Robbins é o Presidente/CEO da Gentoo Technologies, Inc., o criador do Gentoo Linux, um Linux avançado para o PC, e o sistema Portage, um sistema de portas de nova geração para Linux. Ele também serviu como um autor contribuinte para os manuais de Macmillan Caldera OpenLinux Unleashed, SuSE Linux Unleashed e Samba Unleashed. Daniel se envolveu com computadores de alguma maneira desde o segundo grau, quando foi exposto pela primeira vez à linguagem de programação. Logo, assim como a uma dose potencialmente perigosa de Pac Man. Isso provavelmente explica por que ele desde então teve a função de Artista Gráfico Principal na SONY Electronic Publishing/Psygnosis. Daniel gosta de passar o tempo com a esposa, Mary, e sua filha recém-nascida, Hadassah. É possível entrar em contato com o Daniel em drobbins@gentoo.org.



01/Set/2000

Como as pessoas do Linux/UNIX, nós passamos muito tempo trabalhando no shell e, em muitos casos, isso é o que recebemos de volta:

bash-2.04$

Se você é root, tem o direito à versão "prestígio" desse belo prompt:

bash-2.04#

Esses prompts não são exatamente bonitos. Não é de se estranhar que várias distribuições do Linux atualizaram seus prompts padrão que incluem cor e informações adicionais ao boot. No entanto, mesmo que você tenha uma distribuição moderna fornecida com um prompt bom e colorido, ela pode não ser perfeita. Talvez você queira incluir algumas cores ou incluir (ou remover) informações do próprio prompt. Não é difícil projetar seu prompt colorido e especializado a partir do zero.

Informações Básicas do Prompt

Sob o bash, é possível configurar seu prompt alterando o valor da variável de ambiente da PS1, como segue:

$ export PS1="> "
>

As alterações têm efeito imediatamente e podem ser feitas permanentes colocando-se a definição "exportar" em seu arquivo ~/.bashrc. A PS1 pode conter qualquer quantidade de texto simples que você quiser:

$ export PS1="Este é meu superprompt > "
Este é meu superprompt >

Embora isso seja, talvez, interessante, não é exatamente útil ter um prompt que contenha muitos textos estáticos. A maioria dos prompts customizados contêm informações como o nome de usuário atual, o diretório de trabalho ou o nome do host. Essas migalhas de informações pode ajudá-lo a navegar em seu universo shell. Por exemplo, o seguinte prompt exibirá seu nome de usuário e nome do host:

$ export PS1="\u@\H > "
drobbins@freebox >

Esse prompt é especialmente prático para pessoas que efetuam login em várias máquinas sob várias contas, nomeadas de modo diferente, já que ele age como um lembrete de qual máquina você está realmente e que privilégio possui no momento.

No exemplo acima, nós instruímos o bash para inserir o nome de usuário e o nome do host no prompt utilizando seqüências de caracteres de escape com barra invertida que o bash substitui por valores específicos quando eles aparecem na variável de PS1. Nós utilizamos as sequências "\u" (para nome de usuário) e "\H" (para a primeira parte do nome do host). Aqui está uma lista completa de todas as sequências especiais que o bash reconhece (é possível localizar essa lista na página de instrução do bash, na seção "PROMPTING"):

SequênciaDescrição
\aO caractere bell do ASCII (também é possível digitar \007)
\dData no formato "Qua Set 06"
\eO caractere de escape do ASCII (também é possível digitar \033)
\hPrimeira parte do nome do host (como "mybox")
\HNome do host integral (como "mybox.mydomain.com")
\jO número de processos que você suspendeu nesse shell pressionando ^Z
\lO nome do dispositivo de terminal do shell (como "ttyp4")
\nNova linha
\rRetorno de linha
\sO nome do executável shell (como "bash")
\tTempo no formato 24 horas (como "23:01:01")
\TTempo no formato 12 horas (como "11:01:01")
\@Tempo no formato 12 horas com am/pm
\uSeu nome de usuário
\vVersão do bash (como 2.04)
\VVersão do bash, incluindo patchlevel
\wDiretório de trabalho atual (como "/home/drobbins")
\WO "nome básico" do diretório de trabalho atual (como "drobbins")
\!Posição do comando atual no buffer de histórico
\#Número do comando (este irá contar a cada prompt, desde que seja digitado algo)
\$Se você não for root, insere um "$"; se você for root, obtém um "#"
\xxxInsere um caractere ASCII com base no número de três dígitos xxx (substitui dígito não utilizados por zeros, como "\007")
\\Uma barra invertida
\[Essa sequência deve aparecer antes de uma sequência de caracteres que não move o cursor (como seqüências de escape de cor). Isso permite ao bash calcular o agrupamento de palavras corretamente.
\]Essa sequência deve aparecer após uma sequência de caracteres não imprimíveis.

Portanto, aí você tem todas as seqüências de escape com barras invertidas especiais do bash. Divirta-se um pouco com elas para perceber como elas funcionam. Após ter feito um pouco de teste, é hora de incluir alguma cor.


Colorização

Incluir cor é bem fácil; a primeira etapa é projetar um prompt sem cor. Então, tudo o que precisamos é incluir seqüências de escape especiais que serão reconhecidas pelo terminal (em vez do bash) e fazê-lo exibir certas partes do texto em cores. Terminais Linux e terminais X padrão permitem configurar a cor (texto) do primeiro plano e a cor do primeiro plano e também ativar caracteres "em negrito" se desejado. Temos oito cores para escolher.

Cores são selecionadas incluindo sequências especiais na PS1 -- basicamente colocando valores numéricos entre um "\e[" (escape abrir parêntese) e um "m". Se especificarmos mais de um código numérico, separamos cada código com um ponto e vírgula. Aqui está um código de cor de exemplo:

"\e[0m"

Quando especificamos um zero como código numérico, ele instrui o terminal para reconfigurar o primeiro plano, plano de fundo e as configurações de negrito para seus valores padrão. Você desejará utilizar esse código no final de seu prompt, de forma que o texto que digitar não seja colorido. Agora, vamos examinar os códigos de cor. Verifique essa captura de tela:

Gráfico de Cor
Cor do gráfico

Para usar esse gráfico, encontre a cor que deseja utilizar e localize os números de primeiro plano (30-37) e de plano de fundo (40-47) correspondentes. Por exemplo, se você deseja a cor verde em um fundo preto, os números são 32 e 40. Em seguida, utilize sua definição de prompt e inclua os códigos de cor apropriados. Esse:

export PS1="\w> "

torna-se:

export PS1="\e[32;40m\w> "

Até o momento, tudo bem, mas ainda não está perfeito. Após o bash imprimir o diretório de trabalho, é necessário configurar a cor de volta ao normal com uma sequência "\e[0m":

export PS1="\e[32;40m\w> \e[0m"

Essa definição fornecerá um bom prompt verde, mas é necessário incluir alguns retoques finais. Não precisamos incluir a configuração de cor do plano de fundo 40, já que isso configura o plano de fundo como preto, que é a cor padrão de qualquer maneira. Além disso, a cor verde é bem escura; podemos corrigir isso incluindo um código de cor "1", que ativa o texto mais claro, em negrito. Além dessa mudança, precisamos cercar todos os caracteres não imprimíveis com seqüências de escape de bash especiais, "\[" e "\]". Essas sequências instruirão o bash que os caracteres delimitados não absorvem nenhum espaço na linha, o que permitirá ao agrupamento de palavras continuar a funcionar corretamente. Sem elas, você acabará com um prompt de boa aparência que desarrumará a tela se for digitado por acaso um comando que se aproxime da extrema direita do terminal. Aqui está nosso prompt final:

export PS1="\[\e[32;1m\]\w> \[\e[0m\]"

Não tenha medo de utilizar várias cores no mesmo prompt, dessa maneira:

export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\H> \[\e[0m\]"

Diversão no Xterm

Eu mostrei como incluir informações e cor em seu prompt, mas é possível fazer bem mais. É possível incluir códigos especiais em seu prompt que farão a barra de título de seu terminal X (como rxvt ou aterm) ser dinamicamente atualizada. Tudo o que você precisa fazer é incluir a seguinte sequência em seu prompt da PS1:

"\e]2;titlebar\a"

Simplesmente substitua a "barra de título" da subcadeia pelo texto que gostaria que aparecesse em sua barra de título do xterm e está tudo definido! Não é necessário utilizar texto estático; também é possível inserir seqüências de escape do bash em sua barra de título. Verifique esse exemplo, que coloca o nome de usuário, nome do host e diretório de trabalho atual na barra de título, assim como define um prompt curto e verde claro:

export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "

Esse é o prompt específico que estou utilizando na captura de tela da tabela de cores, acima. Eu gosto muito desse prompt, porque ele coloca todas as informações na barra de título ao invés de no terminal onde ele limita a quantidade que pode caber em uma linha. A propósito, certifique-se de cercar sua sequência da barra de título com "\[" e "\]", porque, no que se refere ao terminal, essa sequência é não imprimível. O problema com a colocação de muitas informações na barra de título é que não será possível ver as informações se estiver utilizando um terminal não-gráfico, como o console do sistema. Para corrigir isso, talvez você queira incluir isso em seu .bashrc:

if [ "$TERM" = "linux" ]
then
	#nós estamos no console do sistema ou talvez utilizando telnet em
	export PS1="\[\e[32;1m\]\u@\H > \[\e[0m\]"
else
	#nós não estamos no console, assuma um xterm
	export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "
fi

Essa instrução condicional do bash irá configurar dinamicamente seu prompt com base em suas configurações do terminal atuais. Para consistência, você desejará configurar seu ~/.bash_profile de forma que ele dê origem a seu ~/.bashrc na inicialização. Certifique-se de que a seguinte linha esteja em seu ~/.bash_profile:

source ~/.bashrc

Dessa maneira, você obterá a mesma configuração do prompt se iniciar um shell de login ou de não-login.

Bem, ai está. Agora, divirta-se e utilize alguns prompts elegantes e coloridos!

Recursos

  • rxvt é um ótimo xterm pequeno que tem, por acaso, uma boa quantidade de documentação relacionada a seqüências de escape mantidas no diretório "doc" incluído na tarball de origem.
  • aterm é um outro programa de terminal, com base em rxvt. Ele suporta diversos recursos visuais bons, como transparência e coloração.
  • bashish é um mecanismo de tema para todos os tipos diferentes de terminais.

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=382599
ArticleTitle=Dica: Mágica do Prompt
publish-date=09012000