[successivo] [precedente] [inizio] [fine] [indice generale] [violazione licenza] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 61.   Gestione della console GNU/Linux e dei terminali a caratteri in generale

Il terminale, in qualunque forma esso sia (console, terminale remoto, applicazione a finestra all'interno di X) è il mezzo normale di comunicazione tra l'utente e il sistema. Senza di esso non ci sarebbe alcuna possibilità di avviare nuovi processi e, di conseguenza, nemmeno di poter compiere alcuna attività.

Per questo, l'attivazione di un programma per la gestione del terminale è l'ultima fase di una procedura di inizializzazione del sistema e precede immediatamente l'attivazione della procedura di accesso (il login), cioè il sistema di riconoscimento dell'utente che si accinge a utilizzare il sistema. I programmi Getty che sono i responsabili dell'attivazione del terminale prima dell'attivazione della procedura di accesso, sono introdotti nel capitolo 62.

La tabella 61.1 elenca i programmi e i file a cui si accenna in questo capitolo.

Tabella 61.1. Riepilogo dei programmi e dei file per la gestione dei terminali a caratteri.

Nome Descrizione
kbd_mode Interroga o modifica la modalità di funzionamento della tastiera.
setleds Impostazione di [BlocNum], [Fissamaiuscole] e [BlocScorr].
showkey Emette il codice corrispondente ai tasti premuti.
sorgenti_linux/drivers/char/defkeymap.c Mappa della tastiera predefinita nel kernel.
/usr/share/keymaps/ Directory dei file di mappa delle varie nazionalità.
loadkeys Modifica la mappa della tastiera.
dumpkeys Emette la mappa della tastiera in funzione.
tty Emette il nome corrispondente al terminale attivo.
stty Definisce le caratteristiche della connessione del terminale.
/etc/termcap Configurazione obsoleta delle caratteristiche dei terminali.
/usr/share/terminfo/x/* Configurazione delle caratteristiche dei terminali.
TERM Variabile di ambiente che definisce il tipo di terminale in uso.
clear Ripulisce lo schermo.
reset Reinizializza l'impostazione del terminale.
setterm Imposta alcuni attributi del terminale a caratteri.

61.1   Tastiera

La gestione della tastiera avviene attraverso un sistema piuttosto complesso. Solitamente si fa riferimento al programma loadkeys come unico responsabile della definizione delle funzioni associate ai tasti, ma questo non basta per comprendere il problema.

I segnali della tastiera vengono ricevuti direttamente dal kernel che poi li fornisce ai programmi, in vario modo, a seconda di una data modalità selezionata.

Il programma kbd_mode permette di conoscere o di modificare la modalità di funzionamento della tastiera, ma la modifica è da riservare sono a occasioni particolari, di solito utilizzando una connessione remota, quando un programma ha modificato la modalità della tastiera rendendo inutilizzabile la console.

61.1.1   Tastiera locale e tastiera remota

In generale, ciò che conta è fare in modo che funzioni correttamente la tastiera connessa al proprio elaboratore. Questo è importante perché, quando si utilizza una connessione remota, per esempio attraverso il protocollo TELNET, la tastiera che si adopera dipende, per la sua configurazione, dall'elaboratore a cui è connessa fisicamente: non dipende quindi dall'elaboratore al quale si è collegati. Leggendolo così potrebbe sembrare una cosa evidente, ma quando ci si trova a farlo veramente, non lo è più così tanto.

In questo senso, se da una connessione remota viene dato un comando per modificare la modalità di funzionamento o la mappa della tastiera, l'effetto si risente sulla console dell'elaboratore che riceve il comando e non nel terminale remoto.

Queste considerazioni permettono anche di comprendere che la connessione remota è indipendente da qualunque configurazione che riguardi la tastiera di un certo elaboratore. Perciò, una configurazione errata che renda inutilizzabile una console, può essere corretta attraverso una connessione remota.

61.1.2   Console virtuali

Un sistema GNU/Linux, come altri sistemi Unix, consente di gestire diversi terminali sull'unica console esistente effettivamente. Questi vengono definiti console virtuali. Attraverso alcune combinazioni di tasti si riesce a passare da una console virtuale all'altra. Queste combinazioni sono normalmente [Alt+F1], [Alt+F2],... oppure [Ctrl+Alt+F1], [Ctrl+Alt+F2],... ma possono essere modificate (anche se ciò non è consigliabile).

La console vera e propria corrisponde quasi sempre alla console virtuale in funzione in un dato momento.

La configurazione della tastiera, a seconda del tipo di modalità su cui si interviene, può avere effetto su tutte le console virtuali, oppure solo su quella attiva.

61.1.3   Controllo della modalità di funzionamento della tastiera con «kbd_mode»

Il programma kbd_mode (1) permette di conoscere o di modificare la modalità di funzionamento della tastiera della console. Ciò significa, implicitamente, che l'effetto riguarda la console virtuale attiva; pertanto, quando viene utilizzato a distanza, attraverso il protocollo TELNET o un altro metodo di connessione simile, ha effetto sulla console virtuale attiva nell'elaboratore al quale si è connessi.

kbd_mode [opzioni]

L'utilizzo di questo programma deve essere fatto con prudenza: la visualizzazione della modalità di funzionamento della tastiera non provoca alcun inconveniente, ma la modifica errata della modalità, comporta l'impossibilità di continuare a utilizzarla.

È meglio evitare di utilizzare questo programma per modificare la modalità della tastiera, da una finestra di terminale, all'interno del sistema grafico X.

Tabella 61.2. Alcune opzioni.

Opzione Descrizione
Se kbd_mode viene avviato senza opzioni, il risultato che si ottiene è la visualizzazione della modalità attiva. Questo dovrebbe essere l'uso normale del programma.

-s

L'opzione -s attiva la modalità scancode, o RAW. Questa è la modalità che si osserva normalmente nelle finestre di terminale del sistema grafico X. Questa modalità non può essere utilizzata per le console virtuali normali.

-k

L'opzione -k attiva la modalità keycode, o MEDIUMRAW. Questa modalità non può essere utilizzata per le console virtuali normali.

-a

L'opzione -a attiva la modalità ASCII o XLATE. Questa modalità è quella normale quando si utilizzano le console virtuali. Questa modalità fa uso della mappa definita da loadkeys.

-u

L'opzione -u attiva la modalità UTF-8 o UNICODE. Questa modalità fa uso della mappa definita da loadkeys.

Se la console di un elaboratore è rimasta bloccata e comunque esiste la possibilità di connettersi a questo da un'altra postazione funzionante, si può ripristinare la modalità corretta della tastiera da lì. Nell'esempio seguente, l'elaboratore da sistemare è dinkel.brot.dg e quello dal quale si interviene è roggen.brot.dg.

roggen.brot.dg$ telnet dinkel.brot.dg[Invio]

Trying dinkel.brot.dg...
Connected to dinkel.brot.dg.
Escape character is '^]'.

login: root[Invio]

Password: ********[Invio]

dinkel.brot.dg# kbd_mode -a[Invio]

dinkel.brot.dg# exit[Invio]

Questo esempio presume che si possieda già una certa conoscenza di come si instaura una connessione remota attraverso un cliente TELNET. L'utente inesperto che dovesse tentare una cosa del genere potrebbe non essere capace di completare l'accesso a causa del fatto che normalmente viene impedito all'utente root di accedere da una postazione remota, per motivi di sicurezza.

61.1.4   Controllo sullo stato della tastiera con «setleds»

Il programma setleds (2) interviene esclusivamente su una console virtuale attiva, o meglio, quella da cui proviene lo standard input. Non può essere utilizzato in altre situazioni. Lo scopo del programma è di intervenire sull'impostazione dei tasti [Fissamaiuscole] (capslock), [BlocNum] (numlock) e [BlocScorr] (ScrollLock).

setleds [opzioni] [modalità...]

Solitamente, questi tasti attivano o disattivano la modalità corrispondente, che viene segnalata anche da una spia luminosa sulla tastiera, una per ogni modalità. Queste spie sono notoriamente dei led (Light emitting diode) e spesso sono chiamati così anche in italiano.

Il programma permette di intervenire sia attivando o disattivando queste modalità, sia accendendo o spegnendo i led.

Tabella 61.3. Alcune opzioni e modalità

Opzione Descrizione
Utilizzando il programma senza argomenti, si ottiene il resoconto sull'impostazione dei tasti su cui può intervenire e su quella dei led corrispondenti.

-F

L'opzione -F è quella predefinita, quando vengono indicate solo delle modalità. Con questa, si modifica lo stato corrispondente alle modalità indicate. Se i led non sono impostati indipendentemente, riflettono la nuova situazione.

-D

L'opzione -D è analoga a -F, con la differenza che la nuova impostazione diviene predefinita ed è ciò che si ripresenta a seguito di un ripristino attraverso l'uso del comando reset.

-L

L'opzione -L fa in modo di intervenire solo sui led. Dal momento in cui si utilizza setleds con questa opzione, si sgancia il funzionamento dei led dall'uso dei tasti a cui sarebbero abbinati. Per ripristinare il collegamento tra led e tasti, si può utilizzare nuovamente setleds con l'opzione -L da sola, senza altri argomenti.

+num

-num

Questa modalità attiva o disattiva [BlocNum].

+caps

-caps

Questa modalità attiva o disattiva [Fissamaiuscole].

+scroll

-scroll

Questa modalità attiva o disattiva [BlocScorr].

Segue la descrizione di alcuni esempi.

61.1.5   Mappa della tastiera

Il primo problema che si incontra dal punto di vista dell'internazionalizzazione di un sistema operativo, è la disposizione dei tasti sulla tastiera. Quando la tastiera viene utilizzata in modalità ASCII o Unicode, il kernel utilizza una tabella di conversione prima di trasmettere alle applicazioni i tasti premuti.

In fase di compilazione del kernel viene definita una tabella predefinita attraverso il file sorgenti_linux/driver/char/defkeymap.c. Normalmente questo file corrisponde alla mappa della tastiera USA, ma può anche essere cambiato come viene mostrato in seguito.

Di solito, la mappa della tastiera viene ridefinita attraverso il programma loadkeys indicando come argomento il nome di un file contenente la mappa desiderata. I file delle varie mappe disponibili sono contenuti normalmente a partire dalla directory /usr/share/keymaps/.

Il sistema della mappa della tastiera che si descrive qui e nelle sezioni seguenti, riguarda solo le console virtuali di GNU/Linux e non l'impostazione fatta dal sistema grafico X per i programmi che si avviano al suo interno.

61.1.6   Visualizzazione dei codici dei tasti con «showkey»

Il programma showkey (3) permette di visualizzare, attraverso lo standard output, il codice corrispondente ai tasti che si premono e si rilasciano. Dal momento che ciò impegna totalmente la tastiera, showkey conclude il suo funzionamento dopo 10 s di inattività.

showkey [opzioni]

Questo programma non può funzionare in una finestra di terminale nel sistema grafico X.

Tabella 61.4. Alcune opzioni.

Opzione Descrizione

-s

--scancodes

Fa in modo che siano mostrati i codici scancode. L'utilizzo della tastiera in questa modalità è abbastanza inusuale, quindi è raro che possa essere utile conoscere la corrispondenza della pressione e rilascio dei tasti in questa modalità.

-k

--keycode

Fa in modo che siano mostrati i codici keycode. È il funzionamento predefinito, quando non si indicano argomenti di alcun genere. È questa la codifica a cui si fa riferimento quando si costruiscono i file di mappa gestiti da loadkeys.

61.1.7   Caricamento di una mappa con «loadkeys»

Il programma loadkeys (4) viene usato normalmente per cambiare la mappa della tastiera utilizzata in tutte le console virtuali, attraverso le indicazioni contenute in un file fornito come argomento o attraverso lo standard input. Il file fornito come argomento, se non contiene l'indicazione di un percorso, viene cercato a partire dalla directory /usr/share/keymaps/piattaforma/.

loadkeys [opzioni] [file]

È importante considerare che la modifica interviene su tutte le console virtuali; pertanto, si tenta qualcosa del genere attraverso una connessione remota si interviene sull'elaboratore con il quale si è connessi e non su quello dal quale si sta operando.

loadkeys può essere utilizzato anche solo per generare un file sorgente da utilizzare al posto di sorgenti_linux/drivers/char/defkeymap.c quando si compila un nuovo kernel.

Tabella 61.5. Alcune opzioni.

Opzione Descrizione

-m

--mktable

Emette attraverso lo standard output il contenuto di un file che può essere utilizzato al posto di sorgenti_linux/drivers/char/defkeymap.c in modo da essere incorporato nel kernel alla prossima compilazione.

-u

--unicode

Imposta la modalità Unicode.

Segue la descrizione di alcuni esempi.

61.1.8   Analisi della configurazione attuale con «dumpkeys»

Il programma dumpkeys (5) viene usato normalmente per emettere attraverso lo standard output la mappa attuale della tastiera.

dumpkeys [opzioni]

Attraverso le opzioni si può controllare la quantità delle informazioni ottenute e il modo in cui queste vengono visualizzate.

Tabella 61.6. Alcune opzioni.

Opzione Descrizione

-i

--short-info

Emette alcune informazioni essenziali sulla gestione attuale della tastiera.

-l

--long-info

Emette le informazioni relative all'opzione -i, assieme ai simboli che possono essere utilizzati.

Segue la descrizione di alcuni esempi.

61.2   Personalizzazione della mappa della tastiera

Generalmente si usa loadkeys con file di mappa già predisposti; tuttavia può essere utile comprendere come si realizzano questi file per una propria personalizzazione.

All'interno del file sono ammessi i commenti, prefissati con un punto esclamativo (!) oppure con il simbolo #; nello stesso modo sono ignorate le righe vuote e quelle bianche. Le righe che definiscono qualcosa possono essere continuate con una barra obliqua inversa (\) che precede il codice di interruzione di riga.

Possono essere usate diverse definizioni; in particolare quelle descritte nella tabella seguente.

Tabella 61.7. Direttive principali.

Direttiva Descrizione

charset "iso-8859-x"

Questa direttiva definisce l'insieme di caratteri utilizzato; generalmente si tratta di iso-8859-1 o di iso-10646-18 (nel secondo caso si fa riferimento a Unicode). Quando si tratta della codifica ISO 8859-1 non è nemmeno necessario inserire questo tipo di dichiarazione nei file.

keycode numero_tasto = simbolo simbolo...

Questa definizione attribuisce a un tasto diversi significati, in funzione della combinazione eventuale con altri.

string nome = stringa

Per facilitare la costruzione di un file di mappa del genere, si possono definire alcuni nomi di tasti il cui significato viene chiarito in seguito attraverso questo tipo di dichiarazione. Lo si fa normalmente con i tasti funzionali ([F1], [F2], ecc.).

61.2.1   Modificatori

Con il termine modificatore si fa riferimento a quei tasti che si possono usare per ottenere delle combinazioni. La tabella 61.8 ne mostra l'elenco e il peso.

Tabella 61.8. Elenco dei tasti modificatori e del loro peso.

Modificatore Sigla peso
(nessuno) 0
Maiuscole (tasto sinistro o destro indifferentemente) Shift 1
Alt destro AltGr 2
Control (tasto sinistro o destro indifferentemente) Ctrl 4
Alt sinistro Alt 8
Maiuscole sinistro ShiftL 16
Maiuscole destro ShiftR 32
Control sinistro CtrlL 64
Control destro CtrlR 128

I modificatori sono otto, a cui si somma la situazione normale in cui nessun modificatore viene utilizzato. Volendo indicare tutte le combinazioni possibili di modificatori, queste sarebbero 255, ma è un po' difficile immaginare che si voglia definire una combinazione del tipo [CtrlL+CtrlR+Alt+AltGr+Shift+a] o ancora peggiore (sarebbe decisamente un bell'esercizio di digitazione).

Attraverso il numero del peso, si può fare riferimento a un modificatore o a una combinazione di modificatori, in modo molto semplice: sommandone i valori. Per esempio, uno rappresenta [Shift], due rappresenta [AltGr] e tre rappresenta [Shift+AltGr]. Di conseguenza, 255 rappresenta la pressione simultanea di tutti i modificatori.

61.2.2   Specificazione di mappa

Quando si specifica la funzione di un tasto attraverso l'istruzione keycode, si indicano una serie di funzioni in sequenza. Il significato di questa sequenza dipende dai tipi di modificatori e dalle loro combinazioni che si intendono utilizzare. Questo viene definito attraverso un'istruzione keymaps iniziale.

keymaps peso[,peso]...

Per esempio, l'istruzione seguente indica l'utilizzo dei pesi 0, 1, 2, 4, 6, 8, 9 e 12.

keymaps 0-2,4,6,8-9,12

Come si vede nell'esempio, si fa riferimento anche a intervalli, quindi, 0-2 rappresenta tutti i valori da zero a due, ovvero, zero, uno e due. La stessa cosa avrebbe potuto essere dichiarata in un modo più esplicito come nell'esempio seguente:

keymaps 0,1,2,4,6,8,9,12

Questi valori indicano che nella mappa definita dalle direttive successive, si fa riferimento ai tasti premuti da soli, in combinazione con [Shift], [AltGr], [Ctrl] (indifferentemente sinistro o destro), [Ctrl+AltGr], [Alt], [Alt+Shift] e [Ctrl+Alt]. Le istruzioni keycode successive all'istruzione keymaps dell'esempio vengono interpretate di conseguenza. L'esempio seguente dovrebbe chiarirlo.

keycode 26 = egrave  eacute  bracketleft  Escape  VoidSymbol  Meta_bracketleft

In questo caso, premendo il tasto corrispondente alla lettera è, nella tastiera italiana, si ottiene esattamente questa lettera (egrave). In combinazione con:

In tutti i casi rimanenti non si ottiene alcun risultato.

61.2.3   Alt o Meta

Dall'esempio visto nella sezione precedente dovrebbe essere apparsa finalmente chiara la differenza tra «Alt» e «Meta». Alt è il nome di un tasto di una tastiera particolare, mentre Meta è un'astrazione che serve a generalizzare le definizioni.

Dall'esempio visto in precedenza, quello riportato nuovamente qui sotto, si fa in modo di abbinare alla combinazione reale [Alt+è], di una tastiera italiana, la combinazione astratta [Meta+[].

keymaps 0,1,2,4,6,8,9,12
...
keycode 26 = egrave  eacute  bracketleft  Escape  VoidSymbol  Meta_bracketleft

61.2.4   keycode

L'istruzione keycode permette di indicare in sequenza il significato di un certo tasto, in funzione dell'eventuale combinazione con i modificatori previsti con l'istruzione keymaps.

Quando si vuole indicare un'azione nulla, si usa il nome VoidSymbol; inoltre, ciò che non viene scritto nella parte finale vale come se fosse sempre VoidSymbol.

Per facilitare l'indicazione del risultato di combinazioni si possono usare dichiarazioni keycode successive, precedute dai nomi dei modificatori coinvolti, che valgono per una singola situazione. L'esempio seguente è identico, per risultato, a quello visto in precedenza; la differenza sta nel fatto che così ci si limita a indicare un'istruzione keycode normale per le situazioni comuni (tasto premuto da solo, oppure in combinazione con [shift], o anche con [AltGr]), aggiungendo sotto, eventualmente, le altre combinazioni utili.

keymaps 0,1,2,4,6,8,9,12
...
keycode  26 = egrave           eacute           bracketleft
        control keycode  26 = Escape          
        alt     keycode  26 = Meta_bracketleft

Volendo essere precisi e dettagliati, si può indicare il modificatore plain per fare riferimento alla pressione del tasto senza modificatori. L'esempio appena mostrato si traduce in quello seguente:

keymaps 0,1,2,4,6,8,9,12
...
plain   keycode 26 = egrave
shift   keycode 26 = eacute
altgr   keycode 26 = braceleft
control keycode 26 = Escape          
alt     keycode 26 = Meta_bracketleft

61.2.5   Funzionalità speciali

Studiando un file di mappa della tastiera si possono trovare alcune cose interessanti, come la definizione di combinazioni particolari. Gli estratti riportati di seguito provengono dalla mappa italiana normale: /usr/share/keymaps/i386/qwerty/it.kmap. I modificatori utilizzati sono quelli degli esempi precedenti, ovvero: 0, 1, 2, 4, 6, 8, 9 e 12.

keycode  57 = space            space           
        control keycode  57 = nul             
        alt     keycode  57 = Meta_space      
        control alt keycode 57 = Meta_nul

Nell'esempio appena mostrato, quando ciò potesse servire, la combinazione [Ctrl+Spazio] genera un carattere <NUL>.

keycode  59 = F1               F11              Console_13      
        control keycode  59 = F1              
        alt     keycode  59 = Console_1       
        control alt     keycode  59 = Console_1       
keycode  60 = F2               F12              Console_14      
        control keycode  60 = F2              
        alt     keycode  60 = Console_2       
        control alt     keycode  60 = Console_2       
...
string F1 = "\033[[A"
string F2 = "\033[[B"
...
string F11 = "\033[23~"
string F12 = "\033[24~"
...

Si tratta della dichiarazione del comportamento dei tasti funzionali. I nomi di questi tasti non sono riconosciuti e quindi si dichiara più avanti la stringa che deve essere generata quando si fa riferimento a questi.

Si può osservare che la combinazione [Shift+F1] genera l'equivalente di [F11].

La combinazione [Alt+F1] o [Ctrl+Alt+F1] serve notoriamente per selezionare la prima console virtuale, cosa che viene definita chiaramente con le istruzioni alt keycode 59 = Console_1 e control alt keycode 59 = Console_1. Nello stesso modo si può osservare che la combinazione [AltGr+F1] seleziona la tredicesima console virtuale (ammesso che ci sia).

keycode  70 = Scroll_Lock      Show_Memory      Show_Registers  
        control keycode  70 = Show_State      
        alt     keycode  70 = Scroll_Lock     

Da questa dichiarazione, si osserva che la combinazione [Shift+BlocScorr] visualizza la situazione dell'uso della memoria, la combinazione [AltGr+BlocScorr] mostra la situazione dei registri e la combinazione [Ctrl+BlocScorr] mostra lo stato.

61.2.6   Unicode

Quando si vuole configurare la console in modo da utilizzare la codifica UTF-8, è necessario che la mappa della tastiera generi codici di questo tipo (assieme al fatto che kbd_mode deve essere stato avviato con l'opzione -u). Inizialmente si dichiara l'uso della codifica Unicode nel modo seguente:

charset "iso-10646-18"

Successivamente, quando si deve fare riferimento a un carattere che nella codifica UTF-8 utilizza più di un byte, si indica con la forma seguente:

U+hhhh

Per esempio, ecco come potrebbe apparire la definizione relativa al tasto [o], con il quale si vuole ottenere anche la lettera «ö», minuscola e maiuscola:

keycode  24 = o
        shift         keycode  22 = O
        altgr         keycode  22 = U+00F6
        shift altgr   keycode  22 = U+00D6

Come si può comprendere, con il modificatore altgr si ottiene la lettera «ö», mentre con i modificatori shift e altgr assieme si ottiene la lettera «ö».

61.3   Identificazione del terminale

È importante poter identificare il terminale da cui si accede, almeno in base al tipo di dispositivo utilizzato. In pratica, si dispone del programma tty che è in grado di restituire il nome del file di dispositivo corrispondente. Con questa informazione si possono creare degli script opportuni, eventualmente per filtrare l'accesso da parte degli utenti.

tty [opzioni]

tty emette attraverso lo standard output il nome del terminale con cui si è connessi.

Tabella 61.9. Alcune opzioni.

Opzione Descrizione

-s

--silent

--quiet

Non emette alcuna segnalazione, si limita a restituire un valore.

Valore di uscita:

L'esempio seguente è solo un pretesto per mostrare in che modo potrebbe essere utile tty. Se l'utente sta utilizzando la prima console virtuale (/dev/tty1), viene respinto; altrimenti viene eseguito il comando ls.

#!/bin/sh
if [ `tty` = "/dev/tty1" || `tty` = "/dev/vc/1" ]
then
    echo "spiacente, non puoi usare questo terminale"
else
    ls
fi

61.4   Configurazione del terminale

Le caratteristiche dei terminali a caratteri possono essere molto diverse e questo è il problema principale che si pone di fronte alla ricerca verso una standardizzazione nel comportamento dei programmi per i sistemi Unix.

Si distinguono due problemi di ordine diverso: la configurazione del I/O (input-output), ovvero dei flussi di dati tra il terminale (TTY) e il sistema, e la configurazione particolare dello schermo. La configurazione dei flussi di dati regola il modo in cui i dati possono essere inseriti attraverso la tastiera e come questo inserimento può essere controllato sullo schermo durante la sua digitazione (eco); la configurazione dello schermo riguarda il modo di rappresentare simboli determinati e di comportarsi di fronte a sequenze di escape determinate.

Figura 61.1. Schema banale della connessione di un terminale a caratteri.

connessione di un terminale a caratteri

Il tipo di connessione utilizzata (si pensi alla differenza che c'è tra una console legata strettamente con il sistema, rispetto a un terminale seriale o remoto), implica problemi differenti di gestione della linea TTY. L'utilizzatore normale non ha mai bisogno di preoccuparsi di questo, in quanto per ogni situazione c'è già un'impostazione predefinita che dovrebbe soddisfare le esigenze di tutti. Inoltre, nelle connessioni remote, il problema di questa configurazione si sposta sui programmi che si utilizzano per tali scopi; sono poi questi programmi a definire la configurazione della linea e dei flussi di dati elementari.

All'utente è data la possibilità di verificare questa configurazione e di modificarla, attraverso il programma stty (Set tty).

La fase successiva è la definizione delle particolarità degli schermi dei terminali, per ciò che riguarda le sequenze di escape che questi riconoscono, attraverso una sorta di base di dati, in modo da permettere ai programmi di potervisi adattare.

61.4.1   Linea TTY

Prima di descrivere l'utilizzo sommario di stty, conviene prendere confidenza con il problema, attraverso un po' di esercizio.

cat > /dev/null[Invio]

Avviando il programma cat in questo modo, si può analizzare ciò che succede quando si inserisce qualcosa attraverso la tastiera del proprio terminale.

asdfghjkl[Invio]

qwertyuiop[Invio]

Digitando lettere normali, queste appaiono semplicemente sullo schermo. L'eco dell'input, non è una cosa scontata; deriva da una configurazione, anche se questa è generalmente predefinita.

[Ctrl+p][Ctrl+l][Esc][F1][F2][Invio]

^P^L^[^[[[A^[[[B

Generalmente, i caratteri di controllo che non hanno significati speciali, vengono visualizzati (eco) come lettere maiuscole (o brevi stringhe) precedute da un accento circonflesso, come mostra l'esempio. Si tratta di una caratteristica configurabile, anche se normalmente è già impostata in questo modo.

Ad alcuni caratteri di controllo viene attribuito un significato speciale, che si traduce in un comportamento e non nell'eco di un qualche simbolo.

asdf ghjk lqwe rtyu iop[Ctrl+?][Ctrl+?][Ctrl+?][Ctrl+w][Invio]

asdf ghjk lqwe

La combinazione [Ctrl+?] genera normalmente il carattere speciale ^?, che di solito è abbinato alla funzione erase, che a sua volta si traduce nella cancellazione dell'ultimo carattere inserito. La combinazione [Ctrl+w] genera normalmente il carattere speciale ^W, che di solito è abbinato alla funzione werase, che a sua volta si traduce nella cancellazione dell'ultima parola inserita.

Ad altri caratteri di controllo viene abbinato l'invio di un segnale al processo collegato alla linea di terminale. Ecco che così, di solito, la combinazione [Ctrl+c] genera il carattere speciale ^C, con il quale viene inviato un segnale SIGINT al processo collegato. Nello stesso modo, la combinazione [Ctrl+z] genera il carattere speciale ^Z, con il quale viene inviato un segnale SIGTSTP al processo collegato (cosa che generalmente si traduce nell'essere messo sullo sfondo dalla shell).

Per concludere questo esercizio, basta utilizzare la combinazione [Ctrl+c], per terminare il funzionamento di cat.

[Ctrl+c]

Un'altra cosa interessante è la possibilità di bloccare il flusso dell'output sullo schermo e di riprenderlo successivamente. Per questo si usano normalmente le combinazioni di tasti [Ctrl+s] e [Ctrl+q], che generano rispettivamente i codici ^S e ^Q.

Per verificarne il funzionamento, basta provare a lanciare un comando che emette un output molto lungo, come il seguente:

find / -print[Invio]

Per sospendere il flusso visualizzato sullo schermo del terminale, basta premere [Ctrl+s]; per farlo riprendere, [Ctrl+q].

61.4.2   Utilizzo di «stty»

Il programma stty (6) permette di modificare le caratteristiche della connessione del terminale al sistema. Se viene avviato senza argomenti, visualizza le informazioni salienti della connessione. Gli argomenti della configurazione sono delle parole chiave che possono apparire precedute o meno dal trattino che di solito si usa per le opzioni: se non si usa il trattino, la parola chiave viene intesa come attivazione di qualcosa, con il trattino si intende la disattivazione della stessa cosa.

stty [opzioni | configurazione]

Il motivo più comune per servirsi di questo programma è quello di conoscere le combinazioni di tasti che si possono utilizzare per generare dei segnali particolari. Avviando stty con l'opzione -a si ottiene la configurazione corrente.

stty -a[Invio]

Per esempio, si potrebbe ottenere qualcosa di simile al listato seguente:

speed 38400 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

L'esempio indica in particolare che il carattere intr (interrupt) viene generato con la combinazione [Ctrl+c]; il carattere quit viene generato con la combinazione [Ctrl+\]; il codice di EOF (End of file) viene generato con la combinazione [Ctrl+d]; il carattere susp (suspend) viene generato con la combinazione [Ctrl+z].

Per comprendere meglio il senso di questo programma, vale la pena di descrivere l'uso di alcune opzioni, anche se nella maggior parte dei casi, stty non viene mai usato per queste cose (tabella 61.10).

Tabella 61.10. Alcune opzioni.

Opzione Descrizione

cs8

Definisce la dimensione dei caratteri a 8 bit.

hupcl

-hupcl

Attiva o disattiva l'invio di un segnale di aggancio (SIGHUP) in corrispondenza della conclusione dell'attività dell'ultimo processo, cosa che chiude la connessione con il terminale.

crtscts

-crtscts

Attiva o disattiva il controllo di flusso RTS/CTS. Evidentemente, questo tipo di controllo di flusso riguarda i terminali connessi attraverso la porta seriale.

brkint

-brkint

Attiva o disattiva l'invio di un segnale di interruzione (SIGINT) in corrispondenza dell'invio di un carattere break.

istrip

-istrip

Attiva o disattiva l'azzeramento dell'ottavo bit dell'input.

ixon

-ixon

Abilita o disabilita il controllo di flusso XON/XOFF. Dalla sua abilitazione dipende il funzionamento di caratteri speciali riferiti ai comandi di stop e start (di solito [Ctrl+s] e [Ctrl+q]).

isig

-isig

Abilita o disabilita l'uso di caratteri speciali, corrispondenti ai comandi intr (interrupt), quit e susp (suspend), che di solito corrispondono a [Ctrl+c], [Ctrl+\] e [Ctrl+z].

icanon

-icanon

Abilita o disabilita l'uso di caratteri speciali, corrispondenti ai comandi erase, kill, werase e rprnt, che di solito corrispondono a [Ctrl+?], [Ctrl+u], [Ctrl+w] e [Ctrl+r].

echo

-echo

Abilita l'eco dei caratteri inseriti. Senza l'attivazione di questa modalità, non sarebbe visibile l'input dalla tastiera.

echoctl

-echoctl

ctlecho

-ctlecho

Attiva o disattiva l'eco dei caratteri di controllo attraverso la notazione ^x, dove x è una lettera che varia a seconda del carattere di controllo da visualizzare.

sane

Questa opzione è una scorciatoia per definirne una serie numerosa, allo stato predefinito ritenuto corretto generalmente. In pratica implica quanto segue: cread -ignbrk brkint -inlcr -igncr icrnl -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; inoltre imposta i caratteri speciali al loro valore predefinito.

I caratteri speciali abbinati a funzionalità particolari in modo predefinito, possono variare da un sistema all'altro. Per modificare l'attribuzione di un carattere speciale a una certa funzione, si utilizza la sintassi seguente:

stty nome_funzione carattere_speciale

Se al posto del simbolo del carattere speciale si utilizza la stringa ^-, oppure la parola chiave undef, quella funzionalità viene disabilitata.

Segue l'elenco di alcune parole chiave utilizzate per definire funzionalità a cui si possono attribuire caratteri speciali.

Tabella 61.11. Alcuni caratteri speciali.

Nome Descrizione

intr

Invia un segnale di interruzione (SIGINT). Normalmente è abbinato al carattere speciale ^C, ovvero alla combinazione di tasti [Ctrl+c].

quit

Invia un segnale di conclusione (SIGQUIT).

erase

Cancella l'ultimo carattere digitato.

kill

Cancella la riga corrente.

eof

Fine del file, ovvero termina l'input. Normalmente è abbinato al carattere speciale ^D, ovvero alla combinazione di tasti [Ctrl+d].

stop

Ferma l'output. Normalmente è abbinato al carattere speciale ^S, ovvero alla combinazione di tasti [Ctrl+s].

start

Riprende l'output dopo uno stop. Normalmente è abbinato al carattere speciale ^Q, ovvero alla combinazione di tasti [Ctrl+q].

susp

Invia un segnale di stop del terminale (SIGTSTP), cosa che generalmente fa sì che la shell metta il processo sullo sfondo. Normalmente è abbinato al carattere speciale ^Z, ovvero alla combinazione di tasti [Ctrl+z].

Per maggiori dettagli sul funzionamento di questo programma, si veda info stty oppure stty(1).

61.4.3   Termcap e Terminfo

Il primo tipo di terminale, la telescrivente, non poneva problemi particolari di configurazione: la tastiera permetteva di inserire numeri, simboli e caratteri dell'alfabeto inglese, a volte senza poter distinguere tra maiuscole e minuscole, mentre la stampante emetteva un flusso di testo normale, interrotto da un codice di interruzione di riga.

Quando il terminale attuale viene usato ancora in questo modo, non si pongono problemi di configurazione, perché non è importante sapere le dimensioni (in caratteri) dello schermo e non importa sapere come spostare il cursore sullo schermo.

Nel momento in cui si utilizza un programma che sfrutta lo schermo nel modo cui si è abituati di solito, mostrando bordi, colori, caselline da riempire, si ha la necessità di usare la tastiera anche per spostare il cursore, cancellare, inserire, attivare funzioni speciali. Quindi, lo schermo deve essere in grado di fare di più che visualizzare semplicemente un flusso di caratteri, deve interpretare delle sequenze particolari come la richiesta di utilizzare un colore determinato, di disegnare un bordo, ecc.

Così, la tastiera non serve solo per scrivere lettere, numeri, punteggiatura e terminare le righe con un ritorno a carrello. Adesso occorre utilizzare anche i tasti che spostano il cursore, occorre assegnare funzionalità particolari a tasti che permettono la modifica del testo e a tasti funzionali programmabili.

Nella storia dell'informatica sono esistiti una quantità enorme di tipi diversi di terminali, intesi come complesso tastiera+schermo, ognuno con piccole differenze rispetto agli altri. Per fare in modo che i programmi che richiedono funzionalità superiori a quelle di una normale telescrivente possano adattarsi ai vari tipi di terminale, viene utilizzato un sistema di configurazione predefinito contenente tutte le informazioni necessarie.

Di questo sistema di configurazione ne esistono due tipi: Termcap e Terminfo. Il primo è il più antico ed è ormai obsoleto, ma viene mantenuto per motivi storici e probabilmente per assicurare la compatibilità con i programmi più vecchi.

Il sistema Termcap è formato soltanto da un file di testo collocato nella directory /usr/share/misc/ (/usr/share/misc/termcap) e il suo contenuto assomiglia vagamente a quello del file /etc/printcap (il file di definizione delle stampanti).

Il sistema Terminfo è invece qualcosa di più complesso. È costituito da tanti file, uno per ogni tipo di terminale, distribuiti su una serie di directory. Il punto di partenza di questa struttura dovrebbe essere la directory /usr/share/terminfo/.

A partire da terminfo/ si diramano una serie di directory composte da un solo carattere, corrispondente all'iniziale dei nomi di terminale che contengono. Il listato seguente, mostra solo un estratto minimo di questa struttura.

terminfo
|-- 1
|-- 2
|-- 3
...
|-- a
|   `-- ansi
|-- b
|-- c
...
|-- l
|   `-- linux
...
|-- v
|   |-- vt100
|   `-- vt220
...
|-- x
|   `-- xterm
...

Se la definizione di un tipo di terminale può essere adatta a diversi nomi, si utilizzano normalmente dei collegamenti simbolici.

I file di definizione del sistema Terminfo sono il risultato di una compilazione attraverso il programma tic, (7) come nell'esempio seguente:

tic prova[Invio]

In questo modo, si va a compilare il file prova, generando presumibilmente il file /usr/share/terminfo/p/prova.

Si ottiene facilmente un elenco dei tipi di terminale previsti con il programma toe: (8)

toe[Invio]

ansi            ansi/pc-term compatible with color
dumb            80-column dumb tty
linux           linux console
linux+utf8      linux console in utf-8 mode
rxvt            rxvt terminal emulator (X Window System)
rxvt-basic      monochrome rxvt terminal emulator (X Window System)
screen          VT 100/ANSI X3.64 virtual terminal
screen-w        VT 100/ANSI X3.64 virtual terminal with 132 cols
sun             Sun Microsystems Inc. workstation console
screen-s        VT 100/ANSI X3.64 virtual terminal with hardstatus line
screen-bce      VT 100/ANSI X3.64 virtual terminal with bce
vt100           dec vt100 (w/advanced video)
vt102           dec vt102
vt220           dec vt220
vt52            dec vt52
xterm           X11 terminal emulator
xterm-debian    Debian xterm (VT220-conformant backspace)
xterm-xfree86   xterm terminal emulator (XFree86)
xterm-r5        xterm R5 version
xterm-r6        xterm X11R6 version
xterm-vt220     XFree86 xterm emulating vt220
xterm-color     generic "ANSI" color xterm (X Window System)
xterm-mono      monochrome xterm
pcansi          ibm-pc terminal programs claiming to be ansi
cons25          freebsd console (25-line ansi mode)
mach            Mach Console
mach-bold       Mach Console with bold instead of underline
mach-color      Mach Console with ANSI color

La directory /usr/share/terminfo/ è il punto di partenza predefinito per il sistema Terminfo, ma questo può essere alterato utilizzando la variabile di ambiente TERMINFO, per indicare una directory differente. Volendo è possibile personalizzare il sistema Terminfo creando una struttura analoga a partire da ~/.terminfo/, cioè dalla directory .terminfo/ nella propria directory personale.

61.4.4   Variabile di ambiente «TERM»

La variabile di ambiente TERM è il mezzo attraverso cui si definisce il tipo di terminale che si utilizza. Normalmente viene impostata automaticamente nel modo più opportuno, con il nome di terminale la cui configurazione deve essere letta da Termcap o da Terminfo.

Quando è impostata in modo errato, si possono presentare due situazioni: il nome del terminale non è previsto, oppure il terminale che si utilizza effettivamente non è compatibile con la definizione contenuta in questa variabile. Nel primo caso, quando si avvia un programma che richiede l'utilizzo di tutto lo schermo, viene segnalato l'errore e, a seconda dei casi, il programma si avvia ugualmente facendo riferimento a un terminale elementare, oppure si rifiuta semplicemente di funzionare.

Unknown terminal: pippo
Check the TERM environment variable.
Also make sure that the terminal is defined in the terminfo database.

Nel secondo caso, il terminale ha invece un comportamento insolito, per diversi aspetti. Per esempio si possono notare simboli strani sullo schermo, la tastiera potrebbe non rispondere nel modo consueto, lo schermo potrebbe essere ridisegnato solo parzialmente.

61.4.5   Adattabilità di un programma e abilità dell'utilizzatore

A questo punto dovrebbe essere chiaro che la tastiera e lo schermo funzionano in maniera differente a seconda dell'apparecchiatura fisica a disposizione e del tipo di configurazione a cui si fa riferimento per il terminale. Per esempio, il fatto che su una tastiera sia presente il tasto [Canc], non vuol dire necessariamente che poi questo dia i risultati che ci si aspetta: la sua pressione potrebbe non avere alcun effetto, oppure generare qualunque altro risultato diverso dal previsto.

Dipende dal nome scelto nel sistema di configurazione dei terminali se questo è in grado di gestire il segnale generato dal tasto [Canc] della propria tastiera e se il significato che a questo viene attribuito corrisponde alle aspettative.

Volendo fare un esempio più concreto e anche piuttosto comune, si può provare a confrontare il funzionamento del programma mc (Midnight Commander), utilizzando la definizione di un terminale differente dal solito, per esempio ansi-mono.

TERM=ansi-mono[Invio]

export TERM[Invio]

Si osserva, prima di tutto, che mancano i colori, che alcune bordature non sono corrette, che i tasti funzionali non danno più l'effetto desiderato.(9)

Alle volte ci si trova veramente davanti a terminali che non possono offrire più di tanto, magari perché si sta operando attraverso una connessione remota con un programma che è in grado di emulare solo alcuni vecchi tipi di terminale. Allora entrano in gioco due elementi: le alternative offerte dal programma, per cui una stessa cosa può essere ottenuta in modi differenti, per poter essere utilizzato anche in presenza di terminali con poche potenzialità; l'abilità dell'utente di adattarsi alle diverse situazioni.

L'esempio tipico di questo genere di programmi è dato dalle interpretazioni recenti di VI. Quasi tutti questi programmi sono in grado di gestire i tasti freccia, [Ins] e [Canc]. Ma quando questi non sono disponibili, si può ritornare all'uso tradizionale con i comandi h, j, k e l, per spostare il cursore, i e x per iniziare l'inserimento e per cancellare.

Ciò significa che, quando si studia un nuovo programma, non si devono disdegnare i comandi apparentemente antiquati, perché sono quelli che poi permettono di «tirarsi fuori dai guai».

61.4.6   Ripulitura dello schermo

Esistono due situazioni in cui si può avere la necessità di ripulire lo schermo: quando si scrive uno script con cui si vuole ripulire tutto per mostrare un messaggio all'inizio dello schermo, oppure quando lo schermo sembra impazzito.

Per questo si utilizzano due programmi: clear e reset. Questi, in realtà, si avvalgono di un terzo che ha funzioni più generali: tput. (10)

clear

Il programma clear chiama tput con l'argomento clear, allo scopo di ripulire lo schermo e ricominciare dalla prima posizione in alto dello schermo.

reset

Il programma reset chiama tput con una serie di argomenti volti a reinizializzare il terminale. È particolarmente utile l'uso di questo programma quando sullo schermo non appaiono più delle lettere normali. In tal caso, si può scrivere reset e premere [Invio] alla cieca. Di solito funziona.

Se si vuole sperimentare questa situazione, basta fare un cat di un file binario, per esempio un programma qualunque, per non potere più leggere quello che si scrive.

In ogni caso, questi programmi, avvalendosi di tput, funzionano solo in base a quanto conosciuto per mezzo di Terminfo o Termcap. Se la variabile TERM non contiene il nome corretto, oppure se questo non è presente nel sistema di configurazione dei terminali, a nulla serve un reset.

Si vedano le pagine di manuale: tput(1), clear(1) e reset(1).

61.4.7   Definizione degli attributi del terminale con «setterm»

Il sistema Terminfo permette di conoscere le stringhe (i comandi) corrispondenti a determinate azioni per il terminale che si utilizza. Attraverso il programma setterm si può impostare in qualche modo il proprio terminale utilizzando implicitamente tali comandi. La documentazione di setterm, setterm(1), è stringatissima e quindi insufficiente a comprendere bene tutte le possibilità che si avrebbero a disposizione. Tuttavia si tratta di un tipo di intervento sulla gestione del terminale di importanza marginale; quindi non vale la pena di preoccuparsene tanto.

setterm opzione

Anche se si può utilizzare una sola opzione per volta, quelle disponibili sono molte, ma qui ne vengono descritte solo alcune, tanto da mostrare il senso di questo programma di servizio.

Tabella 61.12. Alcune opzioni.

Opzione Descrizione

-repeat [on|off]

Attiva o disattiva la ripetizione automatica del tasto premuto a lungo. Se non viene specificato l'argomento, si intende attivare l'opzione implicitamente.

-foreground {black|blue\
  \|green|cyan|red|magenta\
  \|yellow|white|default}

Permette di modificare il colore di primo piano.

-background {black|blue\
  \|green|cyan|red|magenta\
  \|yellow|white|default}

Permette di modificare il colore dello sfondo.

-inversescreen [on|off]

Attiva o disattiva l'inversione dei colori dello schermo. Se non viene specificato l'argomento, si intende attivare l'opzione implicitamente.

-clear

Ripulisce lo schermo.

-reset

Reinizializza lo schermo.

61.5   Codifica UTF-8

La console di un sistema GNU/Linux funziona perfettamente se si utilizza la codifica ISO 8859-1, che è quella predefinita. Per cambiare codifica nell'ambito degli insiemi ISO 8859-n, è sufficiente cambiare l'insieme dei caratteri usati per la visualizzazione sullo schermo, con il programma consolechars (capitolo 62), quindi basta intervenire nella configurazione locale con la variabile di ambiente LANG ed eventualmente le variabili LC_*. Le cose si complicano notevolmente quando si vuole passare alla codifica universale (Unicode), che richiede precisamente l'utilizzo della codifica UTF-8, in cui i caratteri possono utilizzare uno o più byte (capitolo 254).

In questa sezione si annotano alcuni passaggi utili per attivare la gestione della codifica UTF-8 sulla console, tenendo conto però che si tratta di un problema che non ha ancora una soluzione ottimale; inoltre, sono sempre pochi gli applicativi che utilizzano la console e la codifica UTF-8 in modo trasparente.

61.5.1   Caratteri per la console

Per poter visualizzare i caratteri della codifica universale occorre disporre di questi, indicando al sistema un file che ne contiene le informazioni. Si tratta di file contenuti nella directory /usr/share/consolefonts/ e quelli più indicati per la visualizzazione simultanea degli alfabeti più comuni corrispondono al modello LatArCyrHeb-nn.psf. In pratica si tratta di un insieme di caratteri che consente la visualizzazione di testi in alfabeto latino, arabo, cirillico ed ebraico. Si carica uno di questi file nel modo seguente:

consolechars -f /usr/share/consolefonts/LatArCyrHeb-16.psf[Invio]

Una volta fatto questo, ci si accorge subito che i programmi che prima visualizzavano delle cornicette sullo schermo, si trovano ad avere dei problemi abbastanza gravi. Si intuisce che il problema stia nella definizione delle caratteristiche del terminale. Tuttavia, normalmente non è disponibile un tipo di terminale adatto per la console in queste condizioni di lavoro. In tal caso, si può compilare un tipo di terminale speciale:

#       linux-utf8
#       linux console in utf-8 mode
linux+utf8|linux console in utf-8 mode,
        acs_chars=a\261f\370g\361h\260j\331k\277l\332m\300n\305q\304t\
  \\303u\264v\301w\302x\263z\372}\375-\1360\333p\304r\304{\343}\234, enter_alt_charset_mode=\E%@\E[11m, enter_pc_charset_mode=\E%@\E[11m, exit_alt_charset_mode=\E[10m\E%G, exit_attribute_mode=\E[0;10m\E%G, exit_pc_charset_mode=\E[10m\E%G, set_attributes=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;\
  \5%;%?%p5%t;2%;%?%p6%t;37;42;1%;%?%p7%t;32;42%;%?%p9%t;m\E%%@\E[11%;m, use=linux,

Il listato che si vede è il sorgente, tratto da Step by step introduction to switching your debian installation to utf-8 encoding, di Radovan Garabík (<http://melkor.dnp.fmph.uniba.sk/~garabik/debian-utf8/HOWTO/howto.html>), con due righe spezzate per motivi tipografici. Supponendo che questo file si chiami linux+utf8, lo si compila facilmente con tic nel modo seguente:

tic linux+utf8[Invio]

Si ottiene il file /usr/share/terminfo/l/linux+utf8. Per utilizzare questo tipo di definizione del terminale, basta intervenire nella variabile di ambiente TERM:

TERM=linux+utf8[Invio]

export TERM[Invio]

La visualizzazione corretta sullo schermo della console richiede anche l'invio di un codice particolare, con l'aiuto del comando echo:

echo -n -e '\033%G'[Invio]

61.5.2   Mappa della tastiera

Per poter scrivere utilizzando la codifica UTF-8, anche la mappa della tastiera deve essere realizzata appositamente, indicando i simboli che vengono rappresentati con più di un byte attraverso la notazione U+hhhh, come per esempio nell'estratto seguente, già mostrato in precedenza in questo capitolo:

keycode  24 = o
        shift         keycode  22 = O
        altgr         keycode  22 = U+00F6
        shift altgr   keycode  22 = U+00D6

Teoricamente, è possibile adattare la mappa corrente, con l'aiuto di dumpkeys, nel modo seguente:

dumpkeys | loadkeys --unicode[Invio]

In ogni caso, occorre modificare la modalità di funzionamento attraverso kbd_mode:

kbd_mode -u[Invio]

61.5.3   Localizzazione

Naturalmente non bisogna dimenticare di configurare la localizzazione corretta. Prima di poter intervenire nella variabile LANG ed eventualmente nelle variabili LC_*, occorre generare la localizzazione prescelta. A partire da /usr/lib/locale/, oppure da /usr/lib/locale/*/, dovrebbero essere disponibili delle sottodirectory che contengono le localizzazioni già definite. Supponendo di voler creare la localizzazione it_IT.UTF-8, ci dovrebbe essere la sottodirectory con lo stesso nome: it_IT.UTF-8/. Se non c'è, la si può creare come nell'esempio seguente, dove in particolare si presume che queste directory si articolino a partire da /usr/lib/locale/00/:

localedef -v -c -i it_IT -f UTF-8 /usr/lib/locale/00/it_IT.UTF-8[Invio]

Normalmente le distribuzioni GNU/Linux comuni organizzano la creazione e l'aggiornamento delle varie localizzazioni attraverso strumenti più semplici. Quello mostrato è il modo diretto che non richiede la conoscenza di troppi particolari.

Una volta creata la localizzazione è sufficiente intervenire nella variabile di ambiente LANG, lasciando vuote le altre variabili LC_*:

LANG=it_IT.UTF-8[Invio]

export LANG[Invio]

61.5.4   Attivare e disattivare l'utilizzo della codifica UTF-8

Il pacchetto Linux console tools (11) contiene due script che dovrebbero facilitare il passaggio rapido alla codifica UTF-8 e il ripristino della codifica normale:

unicode_start

unicode_stop

Teoricamente il primo script, che attiva la funzionalità, prevede la possibilità di indicare l'insieme di caratteri da usare; in pratica, forse è meglio definire prima questa cosa.

Vale la pena di vedere cosa fanno questi script. Nei listati seguenti sono state semplificate molte cose:

#!/bin/sh
# start unicode mode
dumpkeys | loadkeys --unicode > /dev/null
kbd_mode -u
echo -n -e '\033%G'
#!/bin/sh
# stop unicode
kbd_mode -a
echo -n -e '\033%@'

Quello che manca a questi script è la configurazione della variabile di ambiente LANG e la definizione di un tipo di terminale adatto. Quello che segue potrebbe essere una porzione del file /etc/profile, oppure ~/.profile:

LANG=it_IT.UTF-8
export LANG
if [ "$TERM" = "linux" ]
then
    TERM="linux+utf8"
    export TERM
    echo -n -e '\033%G'
fi

Come si vede, se il terminale risulta già essere una console (in questo caso lo si determina in base al nome contenuto precedentemente nella variabile di ambiente TERM), si cambia il tipo di terminale e si emette una sequenza di escape appropriata.

61.6   Riferimenti

Appunti di informatica libera 2004.10.10 --- Copyright © 2000-2004 Daniele Giacomini -- <daniele (ad) swlibero·org>, <daniele·giacomini (ad) poste·it>


1) Linux console font and keytable utilities   dominio pubblico, salva la licenza particolare di alcuni tipi speciali di carattere

2) Linux console font and keytable utilities   dominio pubblico, salva la licenza particolare di alcuni tipi speciali di carattere

3) Linux console font and keytable utilities   dominio pubblico, salva la licenza particolare di alcuni tipi speciali di carattere

4) Linux console font and keytable utilities   dominio pubblico, salva la licenza particolare di alcuni tipi speciali di carattere

5) Linux console font and keytable utilities   dominio pubblico, salva la licenza particolare di alcuni tipi speciali di carattere

6) GNU core utilities   GNU GPL

7) Ncurses   software libero con licenza speciale FSF

8) Ncurses   software libero con licenza speciale FSF

9) Per terminare l'utilizzo di mc si può utilizzare la sequenza [Esc][0] se non funziona il tasto [F10].

10) Ncurses   software libero con licenza speciale FSF

11) Linux console tools   GNU GPL


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome gestione_della_console_gnu_linux_e_dei_terminali_a_caratteri.html

[successivo] [precedente] [inizio] [fine] [indice generale] [violazione licenza] [translators] [docinfo] [indice analitico]

Valid ISO-HTML!