Páginas

sexta-feira, 9 de dezembro de 2011

Personalizando o Shell do Linux

O shell bash é o mais comum nas distribuições Linux disponíveis, e possui diversas capacidades de personalizações e configurações. Nesta postagem vamos analisar algumas possibilidades de personalização do shell e conhecer um pouco dos conceitos por trás destas personalizações. Assim, além de poder aplicar as dicas conhecidas, você poderá avançar nas configurações e realmente personalizar o shell de acordo com as suas preferências.
As configurações são realizadas em alguns arquivos específicos que podem já existir, ou não, na sua distribuição Linux, bem como podem ficar localizados em locais diferentes, mas, como referência, nesta postagem estou me baseando no Ubuntu 10.

Arquivos

/etc/profile – arquivo de configurações globais do sistema (system-wide) chamado logo após um login, as configurações deste arquivo serão aplicadas a todos os usuários.
/etc/bash.bashrc – arquivo de configurações globais do sitema carregado através do /etc/profile ou quando um shell é aberto através de um ambiente já autenticado.
/etc/inputrc – arquivo de configurações globais do sistema de entrada via teclado.
~/.bash_profile ou .bash_login ou .profile – arquivo de configurações do usuário, chamado logo após um login. Somente um dos arquivos é carregado, na ordem de preferência especificada.
~/.bashrc – arquivo de configurações do usuário carregado através do ~/.profile ou quando um shell é aberto através de um ambiente já autenticado.
~/.bash_logout – arquivo carregado ao realizar logout.

Agora que conhecemos alguns dos arquivos importantes para o ambiente Linux, vamos conhecer algumas configurações.

Apelidos de comandos (Command aliasses)

São substituições de comandos que o shell realiza para tornar mais prático, ou simples, o uso de alguns comandos mais comuns. O local mais comum para a configurações de apelidos é no arquivo ~/.bashrc, e o Ubuntu já traz alguns apelidos prontos, bem como alguns ainda comentados, bastando descomentar para utilizá-los.
O conceito por trás é a praticidade, se você costuma utilizar um comando com opções constantes, basta criar um apelido:
alias ls='ls --color=auto' – cria um apelido para o comando de listagem habilitando o modo colorido, sempre que você der o comando ls (observe que o comando está sendo sobrescrito pelo apelido), o shell realiza a substituição, com a opção de cor, de forma transparente para você.
alias ll='ls -la' – cria um apelido na forma de um novo comando apontando para um dos usos mais comuns do ls. Caso você tenha definido o apelido de cor acima, os dois apelidos entrarão em ação, obtendo uma listagem completa e colorida através do comando ll.
Dica: como comentei acima, o arquivo de configurações ~/.bashrc é o mais comum pois personalizações são consideradas de usuário, mas, como é normal precisar utilizar comandos em modo superusuário, eu gosto de ter disponíveis os mesmos apelidos de comando que uso através do meu usuário normal. Isto pode ser obtido duplicando as configurações do arquivo ~/.bashrc para ambos os usuários ou configurando estes apelidos no arquivo global /etc/bash.bashrc. Esta dica serve, também, para as outras configurações que vamos conhecer nesta postagem.

Talvez um pouco de cor?

É normal encontrarmos entre os usuários de Linux aqueles que preferem o shell configurado com fundo preto e fontes verdes. Longe de querer criar algum tipo de discussão ideológica sobre cores em shell, o meu objetivo é apenas mostrar uma possibilidade de personalização do ambiente, aquele que achar interessante pode utilizar, aquele que achar isto sem sentido apenas pule para a próxima dica, ok?
O Ubuntu já vem configurado para que a saída do comando ls seja colorida através do apelido mostrado na dica anterior, nesta dica vamos ver como dar cor ao prompt. Eu, pessoalmente, prefiro o prompt com cor por estas, e apenas estas, duas razões:
- rápida identificação dos comandos anteriores: eu costumo navegar bastante nas saídas dos comandos, e com o prompt destacado através de cor eu consigo localizar o ponto de início das saídas dos comandos mais rapidamente.
- imediata identificação de usuário root: eu caracterizo o usuário root com prompt vermelho, chamando a minha atenção que devo realizar os comandos necessários e voltar ao modo usuário normal o mais breve possível.
A configuração do prompt para o uso de cor é feita, normalmente, no arquivo ~/.bashrc, então, para atingir o meu objetivo, eu preciso configurar o arquivo .bashrc localizada na pasta do meu usuário e também na pasta do usuário root (/root/.bashrc).
Como primeira modificação, localize a linha force_color_prompt=yes e descomente, esta linha será utilizada logo abaixo em um teste para definir se existe suporte a cores no terminal.
Em seguida, localize a definição do prompt (PS1=) e copie o exemplo abaixo para facilitar o entendimento:
if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\] \$ '
else
    ...
fi
O que está acontecendo na definição do prompt, logo após as definições de chroot, é o seguinte:
\[\e[32m\] - cor verde
\u - usuário logado
@ - a própria arroba
\h - o nome do host
\[\e[0m\] - desliga a cor
: - o próprio dois pontos
\[\e[34m\] - cor azul
\w – diretório atual
\[\e[0m\] - desliga a cor
\$ - o caractere # para o usuário root (UID = 0) e $ para os demais usuários
Nisto observamos que o funcionamento é "ligar" uma cor, mostrar o que deseja e "desligar" a cor, caso você ligue uma cor e não desligue, então toda a saída do comando será naquela cor. O comando de ligar/desligar é decomposto assim:
\[ - inicia uma definição de caracteres ocultos, para que os comandos não sejam exibidos
\e[ - sequencia de escape ANSI (pode ser também \033)
Xm - a cor sendo definida
\] - encerra a definição de caracteres ocultos
E a definição da cor desejada pode ser montada com qualquer valor disponível no sistema e segue o padrão SGR ANSI, alguns destes valores:
1 – negrito e/ou claro
2 - escuro
4 - sublinhado
30 a 37 - cores de fonte
40 a 47 - cores de fundo
90 a 97 - cores claras de fonte
100 a 107 - cores claras de fundo
Assim, para criarmos um texto com fonte amarela em negrito sobre um fundo vermelho teríamos:
echo -e "\e[1;33;41m Claudio Weiler \e[0m"

Histórico de comandos

Você deve conhecer o comando history do Linux, aquele que você utiliza as setas para cima e para baixo para navegar entre os comandos já realizados no shell, ou CTRL+R para pesquisar. O Linux armazena os comandos realizados no shell no arquivo ~/.bash_history, e quando você está navegando no histórico, você está navegando nas linhas deste arquivo. Nesta dica vamos realizar uma melhoria na navegação no histórico através de filtro de comando (ou "histórico filtrado").
Antes de entrar no assunto de navegação do histórico, quero comentar um pequeno destaque. No Ubuntu, se você observar o seu arquivo ~/.bashrc, você verá algumas linhas com configurações como estas:
HISTCONTROL=ignoredups:ignorespace
HISTSIZE=1000
HISTFILESIZE=2000
Estas configurações têm o objetivo de controlar o tamanho do histórico e evitar a entrada de comandos duplicados ou iniciados com espaço no histórico. Caso você esteja utilizando um Linux diferente, verifique a existência destas configurações e adicione se achar conveniente. Aqui as minhas preferências:
# ignoreboth="ignoredups:ignorespace", erasedups=remove comandos duplicados
HISTCONTROL=ignoreboth:erasedups
# expressões regulares de comandos a serem ignorados
HISTIGNORE="history:pwd:ls:l:ll:la:[bf]g:exit"
HISTSIZE=1500
Agora vamos utilizar o arquivo /etc/inputrc para a modificação da forma de navegação no histórico de comandos. No Ubuntu, este arquivo já vem com algumas configurações possíveis comentadas, bastando descomentar para utilizar. Mas estas configurações disponíveis mapeiam as teclas Page Up e Page Down, como já utilizamos as setas para cima e baixo para navegar no histórico, considero mais prático continuar utilizando apenas as setas para cima e baixo para a navegação com filtro também:
"\e[A": history-search-backward
"\e[B": history-search-forward
Incluindo estas linhas em seu arquivo /etc/inputrc, então, você indica que a seta para cima irá mapear o comando de buscar "para trás", e a seta para baixo irá mapear o comando de buscar "para frente". Para utilizar este recurso basta, agora, digitar o inicio de alguma linha de comando que você já possua no histórico e utilizar as setas, serão recuperadas do histórico somente as linhas de comando que correspondam ao inicio de linha que você acabou de digitar. Por exemplo, digite as seguintes linhas de comando:
cd /var
cd /opt
E agora digite "cd /" e utilize as setas para cima e baixo, observando que os comandos que você está recuperando estão filtrados pelo começo de comando que você acabou de digitar.

Até a próxima.

Nenhum comentário:

Postar um comentário

Olá! Antes de postar seu comentário, por favor, observe que comentários técnicos, elogios e sugestões são antecipadamente agradecidos, esclarecimentos sobre os conceitos envolvidos na postagem serão respondidos da melhor forma possível, mas pedidos de ajuda técnica ou suporte individual deverão ser feitos através do formulário de contato. Grato!