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
programasetterm serve 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
|
|
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
|
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: |
|
Para ter a lista completa, |
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: |
|
ou, em linguagem mais clara: digite |
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 |
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:
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.