logo titulo
anterior indice proximo

Terminais e impressoras


Vários aspectos dos terminais e console são configuráveis. Fontes de caracteres, mapeamento de teclado, atributos, velocidade e outros parâmetros das linhas seriais, processamento da entrada, protocolos, etc. Veremos neste capítulo algumas ferramentas que nos habilitam a ter maior controle sobre nossos terminais. Impressoras, apesar de diferentes de terminais, têm algumas características comuns, porisso discutimos também aqui suas propriedades.

O Linux admite terminais ligados por linhas seriais como uma forma de utilização do sistema por vários ao mesmo tempo. Entretanto, existem muitas marcas e modelos diferentes de terminais, cada um com um distindo conjunto de comandos e atributos diferentes. Além dos terminais externos, o teclado e vídeo do computador pode ser usado também como terminal. No Linux, este conjunto teclado+vídeo emula um terminal conhecido pelo nome linux, e emula o terminal VT100 da DEC [34]. Sem falar no xterm, que é um programa emulador de terminal sob o X11, e nos muitos derivativos deste.

Há uma riqueza enorme de comandos para configurar terminais ou a console. Utilitários como setfont, modificam o fonte (tipo VGA), geralmente localizados em/usr/lib/kbd/consolefonts, para suportar os tipos de caracteres usados com linguagens com acentos, caracteres especiais para desenho de caixas no modo texto e muitos símbolos gráficos, ou para usar fontes de caracteres diferentes (decorativos, por exemplo) na console. O programa showkey mostra os códigos das teclas em forma de keycodes, códigos usados nas aplicações, ouscancodes, como vêm diretamente do teclado. O programasettermserve para consultar os bancos de dados termcap ou terminfo, enviando uma string de caracteres para o terminal para produzir um determinado efeito. Por exemplo para escrever em negrito:setterm -bold on esetterm -bold off liga e desliga respectivamente o atributo bold (negrito).

A acentuação em portugues pode ser feita através de mapas de teclado, como o meu próprio (encontrado em http://members.xoom.com/rpragana/brazil.tar.gz), que pode ser instalado desempacotando o .tar.gz e colocando o arquivo brazil.map no diretório /usr/lib/kbd/keytables/. Em seguida, voce o carrega com loadkeys brazil.map, ou põe esse comando nos scripts de inicialização (/etc/rc.d/rc.local, por exemplo), para a carga ficar automática com o boot. Para digitar caracteres acentuados, consulte a minha homepage no mesmo local. Essencialmente, voce digitará o AltGr (Alt da direita) junto com uma das teclas a,e,i,o,u para obter as letras com acento agudo, ou juntamente com as suas vizinhas à direita para obter as letras acentuadas com outros acentos, ou ainda o "c" para obter o c-cedilha e todas essas com Shift para obter as maiúsculas correspondentes. Para quem não se incomoda de teclar um pouco mais, pode também digitar um acento com AltGr e depois a letra a ser acentuada.

configuracao de terminais

Podemos configurar uma linha serial, ou o terminal linux (teclado+placa de vídeo interna) com o comando stty.

obtem configuração corrente do terminal que estamos conectado.

Consulte a tabela abaixo para verificar o significado dos parâmetros mostrados. Alguns parâmetos são somente chaves, portanto os seus valores são mostrados de forma mais compacta: se precedido por "-" significa que a chave está desligada, caso contrário, ligado. Outros possuem um caracter como valor. O símbolo "^C" por exemplo significa o Ctrl-C (um único caracter), mas para modificar esse valor, devemos fornecer os dois caracteres como é mostrado.

~$ stty -a
speed 9600 baud; rows 25; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
modifica alguns parâmetros da configuração. Nesse exemplo, o comando Ctrl-X ficará sendo o novo comando para abortar um programa (usualmente é Ctrl-C), e o eco do terminal será desligado, ou seja, voce não verá mais o que está digitando. ~$ stty intr ^X -echo
obtém configuração numa forma compacta, melhor para usar com scripts. Podemos salvar o resultado, por exemplo, como uma variável (no environment). Posteriomrnet, poderemos usar esse valor para restaurar a configuração original. ~$ stty -g
500:5:bd:8a3b:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:73
~$ export TTY_SETTINGS=`stty -a`
~$
~$ stty $TTY_SETTINGS

O comando stty irá modificar usualmente o terminal ao qual estamos conectado, mas pode ser usado para alterar a configuração de outro terminal ou linha serial (útil em scripts, por exemplo), usando a notação stty <flags> </dev/<tty a alterar>, ou seja, redirigindo a stdin. Por exemplo, stty -a </dev/cua0, irá mostrar a configuração da linha cua0 (primeira serial, equivalente à COM1).

Eis os principais parâmetros usados na configuração de terminais:

  • controle da linha serial
    • cs5, cs6, cs7, cs8 tamanho do caracter de 5,6,7 ou 8 bits.
    • crtscts usa handshaking RTS/CTS (por hardware)
    • cstopb usa 2 stop bits
    • clocaldeabilita controle do modem (para uso sem modems)
    • creadhabilita leitura da linha
    • hupenvia um hangup quando o último processo fechar o terminal
  • controle de entrada
    • ignbrk ignora breaks da linha
    • istrip elimina oitavo bit (terminais ascii)
    • ixonhabilita protocolo xon/xoff (software flow control)
    • icrnl traduz carriage return por newline
  • controle de saida
    • onlcr traduz newlines por carriage returns
    • olcuc traduz todos caracteres para maiúsculos
  • controle local
    • isig habilita sinais de interrupção (^C), quit e suspend
    • icanon habilita outros controles como erase, werase, etc.
    • echohabilita eco do terminal
    • echoe transforma caracteres erase na sequência backspace-espaço-backspace (para "apagar" o caracter da tela)
  • controle combinado (vários controle ao mesmo tempo, mudando o comportamento global do terminal)
    • sane põe o terminal em um modo "normal" de uso
    • raw o terminal fica passando todos os caracteres sem interpretação ou filtragem
    • cookedo oposto ao raw, interpretando tudo

Para ter a lista completa, man stty.

Alguns pequenos truques de algibeira:

Muitas vezes, quando tentamos mostrar no terminal arquivos que contém código binário (executáveis) o terminal fica configurado erroneamente, mostrando alguns caracteres gráficos e irreconhecível. Neste caso, voce deverá restaurar o modo texto com o comando:

echo ^V Esc c

ou, em linguagem mais clara: digite echo, espaço, Ctrl-v,Esc ( a tecla ) e "c" (outra tecla) e bata <Return> (enter). Os caracteres gráficos sumirão e o terminal voltará ao normal.

Outras vezes, o teclado perde o eco, ou fica com o vídeo invertido, ou alguns caracteres esquisitos (mas não necessariamente gráficos). Uma solução é voce executar o comando reset. (bata <Return> reset <Return> por garantia).

termcap e terminfo


Os terminais reconhecem seqências de caracteres especiais para modificar seus atributos como cores, video reverso, posicionamento do cursor, limpeza da tela, desenho de bordas e cantos de janelas (no modo texto), etc. Como não há uma padronização entre os diversos tipos de terminal, precisamos ter uma forma de enviar as sequências corretas para cada terminal, fazendo assim com que um programa rode sem se preocupar com o tipo de terminal que será usado. Existem dois caminhos para se atingir esse objetivo, o banco de dados de capabilidades de terminais, termcap, normalmente presente em /etc/termcap (um arquivo texto), ou o banco de dados terminfo, mais recente, com várias centenas de terminais descritos. A biblioteca ncurses (substituta da curses original da Bell), usa estas informações para produzir programas que apresentam janelas, menus, etc, no modo texto. Programas já familiares para nós como o joe, pine, mc, utilizam estes bancos de dados.

A variável TERM (do environment) indica qual entrada no banco de dados terminfo deve ser usada para obter as sequências de controle do nosso terminal corrente. Voce poderá ver que um terminal sob X11 (um xterm ou rxvt, por exemplo) é executado com a variável TERM=xterm, enquanto que a console, quando em modo texto, faz TERM=linux. A descrição desses bancos de dados de terminais, contudo, foge ao nosso tratamento simplificado.

Veja um exemplo de entrada no arquivo /etc/termcap. Cada tipo de terminal tem uma definição assim. As abreviaturas das capabilidades e definição dos caracteres de controlo podem ser encontrados em man termcap. As capabilidades são separadas por ":", e como sempre, o "\" é usado para continuar na próxima linha; o caracter Esc é representado como \E.

# Generic VT entry. vg|vt-generic|Generic VT entries:\

:bs:mi:ms:pt:xn:xo:it#8:\
:RA=\E[?7l:SA=\E?7h:\
:bl=^G:cr=^M:ta=^I:\
:cm=\E[%i%d;%dH:\
:le=^H:up=\E[A:do=\E[B:nd=\E[C:\
:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:DO=\E[%dB:\
:ho=\E[H:cl=\E[H\E[2J:ce=\E[K:cb=\E[1K:cd=\E[J:sf=\ED:sr=\EM:\
:ct=\E[3g:st=\EH:\
:cs=\E[%i%d;%dr:sc=\E7:rc=\E8:\
:ei=\E[4l:ic=\E[@:IC=\E[%d@:al=\E[L:AL=\E[%dL:\
:dc=\E[P:DC=\E[%dP:dl=\E[M:DL=\E[%dM:\
:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\
:mb=\E[5m:mh=\E[2m:md=\E[1m:mr=\E[7m:me=\E[m:\
:sc=\E7:rc=\E8:kb=\177:\
:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:

o spooler de impressão


Para imprimir, o Linux precisa de uma impressora ligada a uma porta paralela ou serial (qual sistema operacional não precisa?). Se voce estiver usando uma impressora serial, certifique-se primeiro que não há nenhum processo getty rodadndo nessa serial. Nesse caso, ele espera um terminal conectado a esta linha e não um impressora. Desative-o! Se for uma interface paralela, faça um teste rápido para saber em qual paralela ela estará conectada. [35] Então voce estará pronto para instalar um daemon para spooling da impressão. No Linux se usa o lpd, escrito na U. Berkeley, e convertido do BSD. Esse daemon é incializado no boot do sistema e fica à espera de arquivos na sua fila de impressão, normalmente colocados por um utilitário chamado lpr. Quando o arquivo está para ser impresso, o lpd examina o tipo de arquivo e o conteúdo do arquivo /etc/printcap, que define as capabilidades das impressoras, de forma semelhante ao que o termcap acima fazia para os terminais. Entretanteo, o printcap é muito mais simples. Veja o meu printcap (somente a parte relativa a uma das impressoras):

lp|djet500|djet500-a4 with lprMagic Universal Filter:\     
:lp=/dev/lp1:\ :sd=/usr/spool/djet500:\     
:lf=/usr/spool/djet500/log:\ 
:af=/usr/spool/djet500/acct:\     
:if=/usr/local/lprMagic/unifilter:\ 
:mx#0:\     
:sh:

Os parâmetros definidos aí são os seguintes:

lp dispositivo conectado à impressora
sd (spool directory) local aonde serão colocados os arquivos para imprimir
lf (logging file) arquivo para colocar as mensagens de tudo que foi impresso, isto é, semelhante ao syslog.
af (accounting file) semelhante ao anterior, mas indicando tempo, usuário, etc, para contabilizar o uso da impressora
if (input filter) programa que será executado para transformar a entrada em algo reconhecível pela impressora.
mx#nnn tamanho máximo em blocos do arquivo que poderá ser impresso, após filtrado. Se for colocado zero, o tamanho será ilimitado.
of (output filter) filtro de saida, semelhante ao if mas durante a impressão.
sh suprime a impressão do banner, página de rosto com o número do job, usuário, etc. Útil somente quando queremos executar tarefas de impressão para vários usuários, para identificação do usuário que é o dono do documento impresso. (quem usa ou usou mainframes, conhece!)

O filtro de impressão (usualmente o if) geralmente é um script (shell) que, conforme o tipo de arquivo (imagem gif,jpeg, texto, postscript, etc) converte o arquivo para algo a linguagem específica da impressora. Se usarmos uma impressora a laser, usualmente a saida em postscript direto já é a sua linguagem, mas com impressoras jato-de-tinta, por exemplo, precisaremos converter de postscript para o formato usado por essa impressora. Existe um programa que faz essa conversão para praticamente todo tipo de impressora existente, o ghostscript, um emulador de postscript GPLed. Veja a minha linha de comando para conversão postscript para PCL da impressora HP Deskjet 520:

cat <arquivo>|gs -sPAPERSIZE=a4 -sDEVICE=djet500 -sOutputFile=/dev/lp1 - &>/dev/null

Postscript é universalmente usado como linguagem intermediária para impressão em Linux (e outros unices), devido à sua difusão, portabilidade, e à disponibilidade de aplicações para manipular e reformatar (exemplo: imprimir 2 folhas numa página, ou o contrário, imprimir uma página em 4 folhas para fazer um cartaz) o conteúdo das páginas a serem impressas.


rpragana
Wed Jan 13 20:20:04 EDT 1999