Cores com os terminais do Linux Thorbjørn Ravn Andersen, ravn@dit.ou.dk v1.4, 7 de Agosto de 1997 A maioria das distribuições Linux tem um comando 'ls' para listar o conteúdo de um diretório, o qual pode ter a sua saída melhorada visualmente pelo uso de diferentes cores. O problema é que configurar isso não é uma tarefa trivial. Este documento explica os vários aspectos e aproximações da alteração da configuração através da configuração de programas existentes, além da localização de programas alternativos, normalmente não incluídos com as distribuições Slackware ou RedHat, e que podem ser usados na maioria das versões do Unix. A versão deste documento em HTML também está disponível em minha própria fonte em <http://www.mip.ou.dk/~ravn/colour-ls>. ______________________________________________________________________ Índice geral 1. Introdução 2. Uma rápida passagem para os impacientes 3. Será que tenho tudo que é necessário? 4. Que cores devo escolher? 5. Como configurar as cores com o ls 6. Como mudar o padrão das cores do texto 6.1 Xterm 6.2 Console virtual 6.2.1 /etc/issue 6.2.2 /etc/profile ou .profile 6.2.3 /etc/login ou .login 6.3 Acesso remoto 7. Programa ______________________________________________________________________ 11.. IInnttrroodduuççããoo ls GNU Nos últimos anos, o uso de cores se tornou bastante comum. Os usuários estão começando a explorar estes recursos usando programas que utilizam cores para dar um retorno visual rápido em, por exemplo, palavras chaves reservadas a uma linguagens de programação, ou na notificação instantânea de um palavra digitada errada. Como o console de texto do Linux suporta cores, o ls original da GNU foi rapidamente modificado para exibir informações coloridas e incluído no Slackware por volta da versão 2.0. Versões melhoradas destes programas de correção foram migradas agora para a distribuição GNU padrão, e devem mais tarde, serem parte de uma nova distribuição Linux. Esta revisão é uma atualização de uma regravação principal da versão inicial, incluindo informações de xterms e programas de correção do kernel. As informações contidas neste documento foram confirmadas no RedHat 4.1, e originalmente compiladas com a versão 2.0.2 do Slackware e kernel 1.1.54. As informações do programa de correção do kernel foram recuperadas no Slackware 2.2.0 com o kernel 1.2.13, e o tcsh como o interpretador de comandos padrão, e mais tarde confirmadas com um kernel 2.0.27. Se você usa qualquer outra configuração, ou versão do Unix, apreciaria se mandasse para mim uma nota dizendo o seu sistema operacional, sua versão e de que modo o suporte a cores está disponível. 22.. UUmmaa rrááppiiddaa ppaassssaaggeemm ppaarraa ooss iimmppaacciieenntteess Se você tem uma distribuição _n_o_v_a do Linux, faça estas modificações aos arquivos do seu diretório ( eles irão fazer efeito na próxima vez que você entrar no sistema ). ~/.bashrc: alias ls="ls --color" ~/.cshrc: alias ls 'ls --color' É isso! Pode-se querer fazer um ``eval `dircolors $HOME/.colourrc`'', para se obter suas próprias cores. Este arquivo é criado com o ``dircolors -p >$HOME/.colourrc'' e será melhor comentado numa futura edição. 33.. SSeerráá qquuee tteennhhoo ttuuddoo qquuee éé nneecceessssáárriioo?? Antes de tudo, será necessário ter uma versão do ls que saiba usar cores de forma apropriada. Tente este comando no console de texto do Linux ( num xterm isto também funciona ): % ls --color ( o % é um indicador do prompt ( indicador de entrada de dados ) do interpretador de comandos ): Se for dada uma mensagem de erro indicando que o ls não compreende a opção, será necessário instalar uma nova versão do pacote de arquivos utilitários da GNU. Se você não tem um pacote de atualização apropriado para a sua distribuição, obtenha a última versão no seu espelho GNU e faça a instalação diretamente da fonte. Se não houver mensagens erros, significa que o ls compreende o comando. Infelizmente, algumas das versões mais prematuras incluídas com o Slackware ( e possivelmente outras distribuições ) contêm erros. O ls incluído com o RedHat 4.1 versão 3.13 funciona perfeitamente. % ls --version ls - GNU fileutils-3.13 Se for executado o comando ``ls -- color'' num console de texto, a saída deve ser colorida de acordo com os padrões estabelecidos nos sistema, e você pode decidir o que você quer que mude. Se isto for executado num xterm, você pode ou não ter as cores alteradas. Assim como o ls sozinho, o programa original do xterm não tem suporte de cores para programas sendo executados dentro dele, porém, as versões mais novas já tem este suporte. Se o seu xterm não suporta o uso de cores, você deve obter uma nova versão como é descrito no fim deste documento. Entretanto, você pode mudar para um terminal de texto e continuar de lá. 44.. QQuuee ccoorreess ddeevvoo eessccoollhheerr?? ls, escolha de cores Este roteiro do interpretador de comandos ( agradeço a todos que me mandaram versões do bash ) mostra todas as combinações de cores padrões no console atual. Se nenhuma cor aparece, é porque o seu console não suporta a seleção de cores ANSI. #!/bin/bash # Display ANSI colours. # esc="\033[" echo -n " _ _ _ _ _40 _ _ _ 41_ _ _ _42 _ _ _ 43" echo "_ _ _ 44_ _ _ _45 _ _ _ 46_ _ _ _47 _" for fore in 30 31 32 33 34 35 36 37; do line1="$fore " line2=" " for back in 40 41 42 43 44 45 46 47; do line1="${line1}${esc}${back};${fore}m Normal ${esc}0m" line2="${line2}${esc}${back};${fore};1m Bold ${esc}0m" done echo -e "$line1\n$line2" done O número da cor do primeiro plano ( que seria o numero da cor das letras ) é listado na esquerda, e o número da cor de fundo é mostrado no quadro. Se você quiser que os caracteres fiquem em negrito, acrescente "1" aos parâmetros, então, azul brilhante no branco seria "37;44;1". A seqüência de seleção ANSI completa é então ESC [ 3 7 ; 4 4 ; 1 m Nota: a cor de fundo atual não pode ser em negrito, então, você não pode ter amarelo ( marrom em negrito ) Esta é uma limitação do equipamento. ls, tabela de cores As cores são: 0 - preto 4 - azul 3# é a cor de primeiro plano 1 - vermelho 5 - magenta 4# é a cor de fundo 2 - verde 6 - cyan 3 - amarelo 7 - branco ;1 é o negrito 55.. CCoommoo ccoonnffiigguurraarr aass ccoorreess ccoomm oo llss Se você quiser mudar o padrão das cores usadas no ls, será necessário ter uma cópia pessoal no seu diretório home. A cópia pode ser obtida do seguinte modo: cd ; dircolors -p > .coloursrc Depois de modificar este arquivo tão bem comentado, será necessário que ele seja lido na variável de ambiente LS_COLORS, o que normalmente é feito com: eval `dircolors .colourrc` É necessário colocar esta linha no seu .bashrc/.cshrc/.tcshrc ( dependendo do interpretador de comandos que é usado ), para que isto seja feito toda vez que se entra no sistema. Veja a página de manual do dircolors(1) para mais detalhes. 66.. CCoommoo mmuuddaarr oo ppaaddrrããoo ddaass ccoorreess ddoo tteexxttoo ls, como mudar as cores Será necessário dizer ao código do controlador do terminal que você quer outras cores como padrão. Não há uma maneira padrão de fazer isso, porém no caso do Linux, pode-se usar o programa setterm. O "setterm" usa a informação no banco de dados do terminal para configurar os atributos. As seleções são feitas assim: setterm -foreground black -background white -store Onde o "-store" faz com que a mudança seja aplicada ao console que está sendo usado. Isto requer que o terminal atual ( variável de ambiente TERM ) seja descrito "bem o suficiente" no banco de dados do termcap. Se o setterm por alguma razão não funcionar corretamente, eis aqui algumas alternativas: 66..11.. XXtteerrmm ls, xterm Um desses xterms deve estar disponível e pelo menos um deles suporta cores. xterm -fg white -bg blue4 color_xterm -fg white -bg blue4 color-xterm -fg white -bg blue4 nxterm -fg white -bg blue4 onde 'color_xterm' suporta a versão de cor do 'ls'. Esta escolha em particular é parecida com as cores usadas num SGI. 66..22.. CCoonnssoollee vviirrttuuaall console virtual Pode-se modificar o kernel de uma vez por todas, bem como prover um padrão de tempo de execução para os consoles virtuais com uma seqüência de escapes. Recomendo o programa de correção do kernel se você compilou o seu próprio kernel. O arquivo fonte do kernel é /usr/src/linux/drivers/char/console.c por volta da linha 1940, onde deve-se modificar: def_color = 0x07; /* branco */ ulcolor = 0x0f; /* branco forte */ halfcolor = 0x08; /* cinza */ como for apropriado. Usei branco no azul com def_color = 0x17; /* branco */ ulcolor = 0x1f; /* branco forte */ halfcolor = 0x18; /* cinza */ Os números são os códigos de atribuição usados pela placa de vídeo em hexadecimal: o dígito mais significante ( o "1" nas cores exemplificadas acima ) é o fundo; o menos significante é a cor da letra. 0 = preto, 1 = azul, 2 = verde, 3 = cyan, 4 = vermelho, 5 = rosa, 6 = marrom/amarelo, 7 = branco. Some 8 ao número para obter cores "brilhantes". Observe que, na maioria dos casos, um fundo brilhante == caracteres que piscam, fundo enfadonho ( de sjlam1@mda023.cc.monash.edu.au <mailto:sjlam1@mda023.cc.monash.edu.au> ). Pode-se fornecer também um novo padrão de tempo de execução para um console virtual, numa base por monitor com a seqüência não padrão ANSI ( encontrada pela procura de fontes do kernel ) ESC [ 8 ] a qual configura o padrão para as cores das letras e do fundo atuais. Depois, a palavra ( ou cadeia de caracteres ) Reset Attributes ( ESC [ m ) seleciona essas cores ao invés de preto e branco. Será necessário realmente repercutir esta palavra para o console toda vez que você reiniciar. Dependendo no que você usa o seu Linux, pode- se fazer a modificação em vários lugares: 66..22..11.. //eettcc//iissssuuee Isto é onde o "Welcome to Linux xx.yy" é mostrado no Slackware, e é uma boa escolha para uma máquina que trabalha sozinha ( e provavelmente uma praga para os usuários que a acessam com telnet ). Este arquivo é criado na inicialização ( no Slackware no /etc/rc.d/rc.S; no Redhat no /etc/rc.d/rc.local), e você deve modificar as linhas para obter algo como: echo ""> /etc/issue echo Bem vindo ao Linux `/bin/uname -a | /bin/cut -d\ -f3`. >> /etc/issue para ESCAPE="<replace with a single escape character here>" echo "${ESCAPE}[H${ESCAPE}[37;44m${ESCAPE}[8]${ESCAPE}[2J"> /etc/issue echo Bem vindo ao Linux `/bin/uname -a | /bin/cut -d\ -f3`. >> /etc/issue Este código irá colocar o cursor no começo da linha, configurar a cor ( aqui branco no azul ), salvar esta seleção e limpar o resto da tela. A modificação fará efeito na próxima inicialização. Lembre-se de inserir o caracter escape de modo _literal_ no arquivo com o C-q no emacs ou o control-v no vi, uma vez que aparentemente o sh, usado para executar este roteiro, não compreende a sintaxe /033. 66..22..22.. //eettcc//pprrooffiillee oouu ..pprrooffiillee if [ "$TERM" = "console" ]; then echo "\033[37;44m\033[8]" # # ou use setterm. setterm -foreground white -background blue -store fi 66..22..33.. //eettcc//llooggiinn oouu ..llooggiinn if ( "$TERM" == "console" ) then echo "\033[37;44m\033[8]" # ou use setterm. setterm -foreground white -background blue -store endif 66..33.. AAcceessssoo rreemmoottoo acesso remoto Você deve ser capaz de usar o programa setterm como foi mostrado acima. Mais uma vez, isto requer que a máquina remota saiba o suficiente sobre o seu terminal, e que o emulador de terminal forneça as cores de suporte de entrada no sistema. Na minha opinião, a melhor emulação vt100 atualmente disponível para outras plataformas são: · MS-DOS: MS-Kermit ( livre, não é um produto da Microsoft ) · Windows 95/NT: Kermit/95 ( shareware ) · OS/2: Kermit/95 ( shareware ). Perceptível através das cores padrões do telnet e, pode ser adaptado localmente. Veja <http://www.columbia.edu/kermit/> para detalhes sobre Kermit. 77.. PPrrooggrraammaa Todas as informações descritas aqui estão assumindo uma instalação GNU/Linux. Se estiver usando algo diferente ( como por exemplo um Sun executando X ), você pode conseguir e compilar o programa sozinho. A versão colorida do 'xterm' é baseada na fonte padrão do xterm com um programa de correção disponível em qualquer site do X11R6. O xterm distribuído com o R6.3 parece que tem um suporte nativo para cores, porém não testei. ftp://ftp.denet.dk/pub/X11/contrib/utilities/color-xterm-R6pl5-patch.gz Veja a documentação se você usa uma versão mais antiga do X. _N_o_t_a_: Não tentei isso! O 'ls' se encontra no pacote de utilitários GNU disponível em prep.mit.edu ou um dos seus vários sites espelhos. Obtenha no mínimo a versão 3.13. ftp://ftp.denet.dk/pub/gnu/fileutils-3.XX.tar.gz Consegui compilar com sucesso o ls com cores em Solaris, SunOS e Irix. Apreciaria um retorno sobre esse documento. Meu endereço de correio eletrônico é ravn@dit.ou.dk <mailto:ravn@dit.ou.dk>. -- Thorbjørn Ravn Andersen