Come cambiare il titolo di una xterm
Ric Lister, ric@giccs.georgetown.edu
v2.0, 27 ottobre 1999
Questo documento spiega come utilizzare le sequenze di escape per mod
ificare dinamicamente i titoli della finestra e dell'icona di una
xterm. Sono forniti esempi per diverse shell e l'appendice fornisce
le sequenze di escape per altri tipi di terminale. Traduzione a cura
di Lorenza Romano (titti@dei.unipd.it) settembre 2000.
______________________________________________________________________
Indice Generale
1. Dove trovare questo documento
2. Titoli statici
3. Titoli dinamici
3.1 Sequenze di escape xterm
3.2 Riprodurre le sequenze di escape
4. Esempi per shell diverse
4.1 zsh
4.2 tcsh
4.3 bash
4.4 ksh
4.5 csh
5. Stampare il nome del job corrente
5.1 zsh
5.2 Altre shell
6. Appendice: escape per altri tipi di terminale
6.1 IBM aixterm
6.2 SGI wsh, xwsh e winterm
6.3 Sun cmdtool e shelltool
6.4 CDE dtterm
6.5 HPterm
7. Appendice: esempi in altri linguaggi
7.1 C
7.2 Perl
8. Ringraziamenti
______________________________________________________________________
11.. DDoovvee ttrroovvaarree qquueessttoo ddooccuummeennttoo
Questo documento fa ora parte del Linux HOWTO Index
e può essere trovato all'indirizzo
.
L'ultima versione può sempre essere trovata in diversi formati
all'indirizzo .
Questo documento prende il posto dell'howto originario scritto da
Winfried Trümper.
22.. TTiittoollii ssttaattiiccii
Può essere impostato un titolo statico per qualsiasi terminale xterm,
color-xterm o rxvt utilizzando le opzioni di riga di comando (switch)
-T e -n:
xterm -T "Il proprio Titolo della XTerm" -n "Il proprio Titolo
dell'Icona della XTerm"
33.. TTiittoollii ddiinnaammiiccii
Molte persone ritengono utile impostare il titolo di un terminale
affinché rifletta informazioni dinamiche, ad esempio il nome dell'host
a cui è collegato l'utente, l'attuale directory di lavoro, ecc.
33..11.. SSeeqquueennzzee ddii eessccaappee xxtteerrmm
I titoli della finestra e dell'icona di una xterm in esecuzione
possono essere modificati utilizzando le sequenze di escape Xterm. Al
riguardo sono utili le seguenti sequenze:
· ESC]0;ssttrriinnggaaBEL -- Imposta il nome dell'icona e il titolo della
finestra a ssttrriinnggaa
· ESC]1;ssttrriinnggaaBEL -- Imposta il nome dell'icona a ssttrriinnggaa
· ESC]2;ssttrriinnggaaBEL -- Imposta il titolo della finestra a ssttrriinnggaa
dove ESC è il carattere eessccaappee (\033) e BEL è il carattere bbeellll
(\007).
La riproduzione di una di queste sequenze entro la xterm provoca la
modifica del titolo della finestra o dell'icona.
NNoottaa: queste sequenze si applicano alla maggior parte dei derivati
xterm, ad esempio nxterm, color-xterm e rxvt. Altri tipi di terminale
spesso usano sequenze di escape diverse; si veda l'appendice per degli
esempi. Per la lista completa delle sequenze di escape xterm si veda
il file ctlseq2.txt , incluso nella distribuzione xterm, oppure
xterm.seq fornito con la distribuzione rxvt
.
33..22.. RRiipprroodduurrrree llee sseeqquueennzzee ddii eessccaappee
Per le informazioni che rimangono costanti per tutta la durata della
vita della shell, ad esempio l'host e lo username, basterà
semplicemente fare l'echo della stringa di escape nel file rc della
shell:
echo -n "\033]0;${USER}@${HOST}\007"
dovrebbe produrre un titolo del tipo username@hostname assumendo che
le variabili della shell $USER e $HOST siano impostate correttamente.
Le opzioni necessarie al comando echo possono variare da shell a shell
(si vedano gli esempi che seguono).
Per le informazioni che possono cambiare durante il corso della vita
della shell, ad esempio l'attuale directory di lavoro, è necessario
applicare queste sequenze ogniqualvolta il prompt cambia. In questo
modo la stringa viene aggiornata con ogni comando che si immette e può
tenere traccia di informazioni tipo l'attuale directory di lavoro, lo
username, l'hostname ecc. A questo scopo, alcune shell mettono a
disposizione delle funzioni speciali, altre no e si devono inserire le
sequenze del titolo direttamente nella stringa del prompt. Ciò è
chiarito nella prossima sezione.
44.. EEsseemmppii ppeerr sshheellll ddiivveerrssee
Di seguito forniamo una serie di esempi per alcune delle shell più
comuni. Iniziamo con la zsh dato che fornisce parecchie facilitazioni
che rendono più agevole il nostro lavoro. Proseguiremo poi attraverso
esempi di difficoltà crescente.
In tutti gli esempi esaminiamo la variabile di ambiente $TERM per
assicurarci di applicare le sequenze di escape solo alle xterm.
Verifichiamo che $TERM=xterm*; la ragione della presenza del
metacarattere è che alcune varianti (ad esempio rxvt) possono
impostare $TERM=xterm-color.
È necessario fare una osservazione aggiuntiva sui derivati delle shell
C, tipo tcsh e csh. Nelle shell C, le variabili indefinite provocano
un errore fatale (fatal error). Perciò prima di esaminare la
variabile $TERM è necessario verificare la sua esistenza così da non
interrompere shell non interattive. Per ottenere ciò è necessario
includere gli esempi sottostanti in qualcosa tipo:
if ($?TERM) then
...
endif
(A nostro avviso questa è proprio una delle molte ragioni per non
usare le shell C. Si veda _C_s_h _P_r_o_g_r_a_m_m_i_n_g _C_o_n_s_i_d_e_r_e_d _H_a_r_m_f_u_l
_ per una discussione
proficua).
Gli esempi che seguono dovrebbero essere utilizzati inserendoli
nell'apposito file di inizializzazione della shell; cioè un file di
cui le shell interattive fanno il source all'avvio. Nella maggior
parte dei casi il nome del file è qualcosa tipo ._s_h_e_l_lrc (per esempio
.zshrc, .tcshrc, ecc).
44..11.. zzsshh
La zsh fornisce alcune funzioni ed espansioni che utilizzeremo:
precmd () funzione che viene eseguita appena prima di ogni prompt
chpwd () funzione che viene eseguita ogniqualvolta la directory
viene modificata
\e sequenza di escape per escape (ESC)
\a sequenza di escape per bell (BEL)
%n viene espansa in $USERNAME
%m viene espansa nell'hostname fino al primo '.'
%~ viene espansa nella directory, sostituendo $HOME con '~'
Sono disponibili molte altre espansioni: si veda la pagina di manuale
zshmisc.
Quanto segue imposta perciò il titolo della xterm a:
"_u_s_e_r_n_a_m_e@_h_o_s_t_n_a_m_e: _d_i_r_e_c_t_o_r_y":
case $TERM in
xterm*)
precmd () {print -Pn "\e]0;%n@%m: %~\a"}
;;
esac
Ciò potrebbe anche essere ottenuto utilizzando chpwd() al posto di
precmd(). La primitiva print si comporta come echo, ma ci dà la pos
sibilità di usare le sequenze di escape del prompt %.
44..22.. ttccsshh
La tcsh ha delle funzioni ed espansioni simili a quelle della zsh:
precmd () funzione che viene eseguita appena prima di ogni prompt
cwdcmd () funzione che viene eseguita ogniqualvolta la directory
viene modificata
%n viene espansa in username
%m viene espansa in hostname
%~ viene espansa nella directory, sostituendo $HOME con '~'
%# viene espansa in '>' per gli utenti normali,'#' per gli
utenti root
%{...%} include una stringa sotto forma di sequenza di escape
costante
Sfortunatamente non c'è un comando equivalente al comando print della
zsh che permetta di usare le sequenze di escape del prompt nella
stringa del titolo, perciò la cosa migliore che si possa fare è
utilizzare le variabili della shell (in ~/.tcshrc):
switch ($TERM)
case "xterm*":
alias precmd 'echo -n "\033]0;${HOST}:$cwd\007"'
breaksw
endsw
In ogni modo ciò fornisce l'intero percorso della directory al posto
di far uso di ~. In alternativa si può inserire la stringa nel
prompt:
switch ($TERM)
case "xterm*":
set prompt="%{\033]0;%n@%m:%~\007%}tcsh%# "
breaksw
default:
set prompt="tcsh%# "
breaksw
endsw
che imposta un prompt pari a "tcsh% " ed un titolo di xterm e icona
pari a "_u_s_e_r_n_a_m_e@_h_o_s_t_n_a_m_e:_d_i_r_e_c_t_o_r_y". Si noti che "%{...%}" deve con
tenere sequenze di escape (e non può essere l'ultima voce nel prompt:
si veda la pagina di manuale tcsh per i dettagli).
44..33.. bbaasshh
La bash mette a disposizione una variabile $PROMPT_COMMAND che
contiene un comando da eseguirsi prima del prompt. Questo esempio
imposta il titolo a "_u_s_e_r_n_a_m_e@_h_o_s_t_n_a_m_e: _d_i_r_e_c_t_o_r_y":
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
dove \033 è il codice carattere per ESC e \007 quello per BEL.
Si noti che qui è importante l'uso delle virgolette: le variabili
vengono sviluppate, espanse se sono tra "..." e non vengono espanse se
sono tra '...'. Perciò $PROMPT_COMMAND è impostata ad un valore non
espanso, ma le variabili poste all'interno delle "..." vengono espanse
nel momento in cui $PROMPT_COMMAND viene utilizzata.
In ogni caso, $PWD produce l'intero percorso della directory. Se si
vuole usare la forma abbreviata ~, si deve includere la stringa di
escape nel prompt, il che permette di trarre vantaggio dalle seguenti
espansioni del prompt, fornite dalla shell:
\u viene espansa in $USERNAME
\h viene espansa in hostname fino al primo '.'
\w viene espansa in directory, sostituendo $HOME with '~'
\$ viene espansa in '$' per gli utenti normali, '#' per root
\[...\] include una sequenza di caratteri non stampabili
Perciò, quanto segue produce un prompt bash$ e un titolo di xterm
"_u_s_e_r_n_a_m_e@_h_o_s_t_n_a_m_e: _d_i_r_e_c_t_o_r_y":
case $TERM in
xterm*)
PS1="\[\033]0;\u@\h: \w\007\]bash\\$ "
;;
*)
PS1="bash\\$ "
;;
esac
Si noti l'uso di \[...\], che dice alla bash di ignorare i caratteri
di controllo non stampabili nel calcolo della lunghezza del prompt.
Diversamente i comandi per l'editor di linea si confonderebbero nel
posizionare il cursore.
44..44.. kksshh
La ksh fornisce poco dal punto di vista delle funzioni ed espansioni,
perciò si deve inserire la stringa di escape nel prompt affinché venga
aggiornata dinamicamente. Questo esempio produce un titolo
username@hostname: directory e un prompt ksh$ .
case $TERM in
xterm*)
HOST=`hostname`
PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
;;
*)
PS1='ksh$ '
;;
esac
Ad ogni modo, $PWD fornisce l'intero percorso della directory. Si può
rimuovere il prefisso $HOME/ dalla directory usando il costrutto
${...##...}. Si può anche usare ${...%%...} per troncare l'hostname:
HOST=`hostname`
HOST=${HOST%%.*}
PS1='^[]0;${USER}@${HOST}: ${PWD##${HOME}/}^Gksh$ '
Si noti che, nella stringa del prompt, ^[ e ^G sono singoli caratteri
per ESC e BEL (possono essere inseriti in emacs utilizzando C-q ESC e
C-q C-g).
44..55.. ccsshh
Tutto ciò è davvero molto difficile in csh e si finisce per fare
qualcosa del tipo:
switch ($TERM)
case "xterm*":
set host=`hostname`
alias cd 'cd \!*; echo -n "^[]0;${user}@${host}: ${cwd}^Gcsh% "'
breaksw
default:
set prompt='csh% '
breaksw
endsw
dove si è dovuto definire un alias per il comando cd per svolgere la
funzione di invio delle sequenze di escape. Si noti che, nella
stringa del prompt, ^[ e ^G sono singoli caratteri per ESC e BEL (pos
sono essere inseriti in emacs utilizzando C-q ESC e C-q C-g).
Note: su alcuni sistemi si può utilizzare hostname -s per ottenere un
hostname breve anziché interamente specificato. Alcuni utenti, con
collegamenti simbolici a directory, possono scoprire che `pwd` (apici
per eseguire il comando pwd) fornisce un percorso più accurato di
$cwd.
55.. SSttaammppaarree iill nnoommee ddeell jjoobb ccoorrrreennttee
Spesso un utente avvia un job in primo piano (in foreground) di lunga
durata tipo top, un editor, un client email, ecc e desidera che il
nome del job sia mostrato nel titolo. Questo è un problema più
spinoso e si risolve facilmente solo nella zsh.
55..11.. zzsshh
La zsh fornisce una funzione primitiva ideale per questo scopo:
preexec() funzione che viene eseguita esattamente prima che un
comando venga eseguito
$*,$1,... argomenti passati a preexec()
Perciò si può inserire nel titolo il nome del job nel seguente modo:
case $TERM in
xterm*)
preexec () {
print -Pn "\e]0;$*\a"
}
;;
esac
Nota: la funzione preexec() è apparsa attorno alla versione 3.1.2
della zsh, perciò una versione precedente dovrà essere aggiornata.
55..22.. AAllttrree sshheellll
Ciò non è facile con altre shell che sono prive di una funzione
equivalente alla preexec(). Se qualcuno dispone di esempi per favore
li spedisca all'autore.
66.. AAppppeennddiiccee:: eessccaappee ppeerr aallttrrii ttiippii ddii tteerrmmiinnaallee
Molti terminali moderni sono discendenti di xterm o rxvt e supportano
le sequenze di escape che abbiamo utilizzato fino a questo punto.
Alcuni terminali proprietari forniti con tipi diversi di unix usano le
proprie sequenze di escape.
66..11.. IIBBMM aaiixxtteerrmm
aixterm riconosce le sequenze di escape xterm.
66..22.. SSGGII wwsshh ,, xxwwsshh ee wwiinntteerrmm
Questi terminali impostano $TERM=iris-ansi e usano i seguenti escape:
· ESCP1.y_s_t_r_i_n_g_aESC\ Imposta il titolo della finestra a _s_t_r_i_n_g_a
· ESCP3.y_s_t_r_i_n_g_aESC\ Imposta il titolo dell'icona a _s_t_r_i_n_g_a
Per l'intera lista degli escape di xwsh si veda la pagina di
manuale xwsh(1G).
I terminali Irix supportano gli escape xterm per impostare
separatamente il titolo della finestra e il titolo dell'icona ma non
l'escape per impostare entrambi.
66..33.. SSuunn ccmmddttooooll ee sshheellllttooooll
cmdtool e shelltool impostano entrambi $TERM=sun-cmd e usano i
seguenti escape:
· ESC]l_s_t_r_i_n_g_aESC\ Imposta il titolo della finestra a _s_t_r_i_n_g_a
· ESC]L_s_t_r_i_n_g_aESC\ Imposta il titolo dell'icona a _s_t_r_i_n_g_a
Sono davvero programmi pessimi: si usi qualcos'altro.
66..44.. CCDDEE ddtttteerrmm
dtterm imposta $TERM=dtterm e sembra riconoscere sia le sequenze di
escape xterm standard che le sequenze di escape cmdtool della Sun
(verificato su Solaris 2.5.1, Digital Unix 4.0, HP-UX 10.20).
66..55.. HHPPtteerrmm
hpterm imposta $TERM=hpterm e utilizza i seguenti escape:
· ESC&f0k_l_u_n_g_h_e_z_z_aD_s_t_r_i_n_g_a Imposta il titolo della finestra a
_s_t_r_i_n_g_a di lunghezza _l_u_n_g_h_e_z_z_a
· ESC&f-1k_l_u_n_g_h_e_z_z_aD_s_t_r_i_n_g_a Imposta il titolo dell'icona a _s_t_r_i_n_g_a
di lunghezza _l_u_n_g_h_e_z_z_a
Un programma C base per calcolare la lunghezza e fare l'echo della
stringa può essere questo:
#include
int main(int argc, char *argv[])
{
printf("\033&f0k%dD%s", strlen(argv[1]), argv[1]);
printf("\033&f-1k%dD%s", strlen(argv[1]), argv[1]);
return(0);
}
Possiamo scrivere uno shell-script simile utilizzando l'espansione
${#stringa} (zsh, bash, ksh) o l'espansione ${%stringa} (tcsh) per
trovare la lunghezza della stringa. Quanto segue è per zsh:
case $TERM in
hpterm)
str="\e]0;%n@%m: %~\a"
precmd () {print -Pn "\e&f0k${#str}D${str}"}
precmd () {print -Pn "\e&f-1k${#str}D${str}"}
;;
esac
77.. AAppppeennddiiccee:: eesseemmppii iinn aallttrrii lliinngguuaaggggii
Può essere utile scrivere un piccolo programma per stampare un
argomento nel titolo utilizzando gli escape xterm. Sotto è fornito
qualche esempio.
77..11.. CC
#include
int main (int argc, char *argv[]) {
printf("%c]0;%s%c", '\033', argv[1], '\007');
return(0);
}
77..22.. PPeerrll
#!/usr/bin/perl
print "\033]0;@ARGV\007";
88.. RRiinnggrraazziiaammeennttii
Un ringraziamento alle seguenti persone che hanno fornito consigli,
errata corrige ed esempi per questo documento.
Paul D. Smith e Christophe Martin
hanno entrambi fatto notare che avevo le
virgolette nel modo sbagliato nella $PROMPT_COMMAND della bash.
Averle capite esattamente significa che le variabili _v_e_n_g_o_n_o espanse
dinamicamente.
Paul D. Smith ha suggerito l'uso di \[...\]
nel prompt della bash per includere caratteri non stampabili.
Christophe Martin ha provveduto alla soluzione
per ksh.
Keith Turner ha fornito le sequenze di escape per
cmdtool e shelltool della Sun.
Jean-Albert Ferrez ha messo in evidenza alcune
incoerenze nell'uso di "PWD" e "$PWD" e nell'uso di "\" in opposizione
a "\\".
Bob Ellison e Jim Searle
hanno verificato dtterm su HP-UX.
Teng-Fong Seak ha suggerito l'opzione -s per
hostname, l'uso di `pwd` e l'uso di echo nella csh.
Trilia ha suggerito gli esempi in altri linguaggi.
Brian Miller ha fornito le sequenze di escape
e gli esempi per hpterm.
Lenny Mastrototaro ha spiegato l'uso nei terminali
Irix delle sequenze di escape xterm.
Paolo Supino ha suggerito l'uso di \\$ nel prompt
della bash.