GNU/Screen

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Document-page-setup.png Attenzione: questo articolo è ancora incompleto e in fase di scrittura da parte del suo autore.

Sentitevi liberi di contribuire, proponendo modifiche alla guida tramite l'apposita pagina di discussione, in modo da non interferire con il lavoro portato avanti sulla voce. Per altre informazioni si rimanda al template.


Introduzione

GNU/Screen è un multiplatore di terminale che esegue tanti "schermi" separati su un unico terminale, per questa ragione è paragonabile all'uso delle aree di lavoro (workspace) di un ambiente grafico e quindi possiamo considerarlo in un certo qual modo un Window Manager per applicazioni testuali e ncurses.


Installazione

Come sempre Debian rende tutto molto semplice:

# aptitude install screen

In un emulatore di terminale o in una tty lo avviamo quindi con:

$ screen


Le basi

Superato il noioso messaggio di benvenuto (che rimuoveremo più avanti) ci si ritrova al solito prompt e nulla sembra cambiato, purtroppo il non mostrare da subito una barra di stato è una delle pecche di screen e la sua stessa configurazione è piuttosto ostica.

È importante ricordare che screen è studiato per rimanere in funzione in background (non è il termine esatto ma credo renda l'idea) per cui impariamo subito i comandi di base. Qualsivoglia sia la ragione si potrebbe avere la tentazione di chiudere il terminale, aprirne un altro e avviare nuovamente screen; questo significa aprire una nuova sessione ma lasciare attiva la precedente, oltre che errato come concetto si rischia di ritrovarsi con un certo numero di sessioni abbandonate :)


Visualizzazione finestre

screen usa un attivatore per tutte le altre funzioni, ovvero una prima sequenza di tasti che attendono una seconda, questo attivatore è di default Ctrl-a, per cui dire Ctrl-a : significa premere appunto Ctrl-a, rilasciare e quindi premere i due punti.

Innanzitutto rendiamoci la vita facile con la fantomatica statusbar, all'interno di screen digitate:

Ctrl-a :

Il cursore si sposterà al fondo dove appariranno i due punti, questo è il prompt dei comandi, per intenderci è simile alla modalità comando di Vim; da qui possiamo impartire vari comandi che al momento non abbiamo nel file di configurazione o, in altri casi, che vogliamo solo per la sessione in corso.

A questo punto, subito dopo i due punti, scriviamo:

hardstatus alwayslastline

e premiamo Invio.
Ora abbiamo una barra di stato, configuriamola in modo da avere un riscontro visivo delle finestre, questa volta dal prompt bash digitiamo:

screen -X hardstatus string "$(man screen | grep %-L)"

Invece del prompt di screen abbiamo usato la riga di comando, sia per mostrarvi un'altra caratteristica che per la sua versatilità; questi due sistemi non sempre sono uno l'alternativa dell'altro, l'opzione -X è particolarmente usata in script o per inviare comandi più complessi, è inoltre utilizzabile dall'esterno della sessione per inviare comandi remoti.

Abbiamo perciò inviato alla sessione il comando "hardstatus string" che richiede un argomento, e per comodità questo argomento è stato pescato direttamente dalla manpage, la stringa si presenta così:

%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<

Come accennato in apertura, la sintassi è complessa e la affronteremo più avanti.


Scorciatoie e messaggi

Ed ecco che la nostra statusbar, non particolarmente bella ma utile, si presenta come 0-$ bash, un rettangolino bianco su campo blu, mentre per il colore dell'intera barra viene usato il reverse (il contrario del colore di background e foreground usato dal terminale). La numerazione delle finestre parte da zero, ok è strano e con poco senso ma tant'è, ora apriamo un'altra finestra con un'altra istanza di bash:

Ctrl-a c

Ctrl-a è l'attivatore e c la scorciatoia per il comando screen, perché all'interno della sessione, screen apre una finestra che di default prende il nome dalla variabile d'ambiente SHELL.
Ora abbiamo due voci nella barra, la porzione blu indica la finestra attualmente in focus ed anche il suo aspetto "testuale" è diverso:

0$ bash  1-$* bash

Per passare da una finestra all'altra ci sono diversi metodi:

  • finestra specificata da [numero]: Ctrl-a [numero]
  • finestra successiva: Ctrl-a n (oppure Ctrl-a space)
  • finestra precedente: Ctrl-a p (oppure Ctrl-a backspace)
  • finestra visualizzata in precedenza: Ctrl-a Ctrl-a
  • lista selezionabile di finestre: Ctrl-a "


I comandi di uso comune hanno quasi tutti una scorciatoia ed è decisamente più comodo ma tutti sono comunque utilizzabili tramite il prompt, la manpage elenca tutte le scorciatoie predefinite e ogni singolo comando; leggetevelo con calma e, come vedremo più avanti, createvi nuove scorciatoie, anche sostituendo quelle predefinite che non ritenete utili.
In questa guida ne verranno illustrate solo alcune con qualche consiglio ed esempio su come migliorare l'usabilità; alcuni comandi hanno due combinazioni per cui è piuttosto facile eliminarne una e associarla ad altro, fate attenzione perché sono tutte case-sensitive.

Una breve legenda con le eventuali combinazioni create e quindi presenti nel file di configurazione si ottiene con:

Ctrl-a ?


Ogni finestra è rinominabile a piacimento con:

Ctrl-a A

Al prompt dei comandi apparirà la scritta "Set window's title to: bash", basta cancellare il nome attuale e scrivere il desiderato.

E se vogliamo rinumerarla:

Ctrl-a :number 

seguito da uno spazio e il nuovo numero.


Il metodo migliore per chiudere una finestra è terminare il processo in essa contenuto, solo in caso di problemi quali freeze o altro possiamo forzarne la chiusura (e uccidere il processo) con:

Ctrl-a k

Al prompt dei comandi apparirà il messaggio "Really kill this window [y/n]".


Visualizza data, hostname e carico del sistema (load average, quello solitamente mostrato dal comando uptime):

Ctrl-a t

Il messaggio apparirà in basso, sopra la statusbar, per alcuni secondi; per visualizzare l'ultimo messaggio di attività, qualunque esso sia, si usa:

Ctrl-a m

I messaggi di attività sono avvisi inviati da altre finestre in varie occasioni, se ad esempio abbiamo aptitude che lavora nella finestra zero e nel frattempo passiamo alla finestra uno per fare altro, quando aptitude finirà screen ci avvisa con "Activity in window %n", dove %n è sostituito dal numero della finestra.
Il tempo di visualizzazione è impostato a 5 secondi ed è configurabile, possono sembrare pochi ma si scoprirà che talvolta sono anche troppi in quanto durante tale periodo il processo contenuto nella finestra corrente viene in un certo modo bloccato.


Chiusura

"Non mi piace, è complicato, mi sono impantanato e voglio uscire da questo casino!", ovvero come chiudere screen.
La risposta è che è impossibile chiudere screen, non è stato concepito per essere terminato, perché usarlo altrimenti? ;)
Ma se proprio non potete farne a meno:

Ctrl-a C-\

Questa è nuova, che diamine è quel "C-\"? Come dicevo prima ci sono alcuni comandi che hanno una doppia scorciatoia, solitamente per renderla più difficile da digitare per errore, in questo caso significa premere Ctrl-a Ctrl-\ ma se volete davvero evitare brutte sorprese consiglio vivamente di eliminarla e usare il prompt quando occorre:

Ctrl-a :quit

Chiudere screen equivale ovviamente a chiudere tutte le finestre e terminare i processi della sessione, anche qui è consigliabile terminare i processi in modo pulito, almeno quelli importanti o che devono scrivere qualcosa su disco. In alternativa, terminato l'ultimo processo e chiusa l'ultima finestra terminerà anche screen e al prompt apparirà "[screen is terminating]".


Detach e sessioni

Ma passiamo alle cose serie. screen deve restare attivo e insieme a lui tutto ciò che contiene, ma abbiamo bisogno di fare il logout (locale o via SSH), riavviare X, chiudere il terminale o altre operazioni esotiche (tranne riavviare la macchina); questa operazione si chiama detach, ovvero stacchiamo screen da quello che è di fatto il suo contenitore, xterm o tty che sia:

Ctrl-a d

E per riattaccarlo digitiamo al prompt bash:

$ screen -r

Nel caso avessimo più di una sessione staccata andrà specificata quale si vuole. Il precedente comando mostrerà quelle disponibili:

$ screen -r
There are several suitable screens on:
        4322.pts-17.jackinthebox        (15/10/2011 10:06:17)   (Detached)
        4088.pts-15.jackinthebox        (15/10/2011 10:00:17)   (Detached)
        4656.tty        (08/10/2011 01:00:48)   (Attached)
        1981.fugu       (07/10/2011 20:45:07)   (Attached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

L'argomento può essere l'intera stringa o parte di essa, per cui tutte e tre le seguenti combinazioni andranno bene:

$ screen -r 4322.pts-17.jackinthebox
$ screen -r 4322
$ screen -r pts-17

Ma abbiamo altre due stringe curiose, quelle sono le sessioni che uso abitualmente. Per personalizzarne il nome basterà avviare screen con:

$ screen -S fugu

e l'attach avverrà allo stesso modo:

$ screen -r fugu

Se invece volessimo attaccare in un altro terminale o tty una sessione già attaccata useremo:

$ screen -x

Questo può essere utile se ci si collega da un'altra macchina o si vuole condividere la sessione con un altro utente, sebbene per quest'ultima ipotesi ci siano dei comandi appositi.


Escape

Utilizzando Ctrl-a per screen non sarà più possibile usare tale combinazione in bash per andare ad inizio riga (beginning-of-line) o in Vim o altrove; in realtà non è usabile direttamente ma con:

Ctrl-a a 

Il che, a seconda delle esigenze potrebbe essere scomodo, per cui possiamo eventualmente modificare l'attivatore ad esempio con un tasto nelle vicinanze come q oppure s che sono associati al flow control e non ci interessa assolutamente avere, a patto che non interferisca con altre applicazioni. A scelta si può avviare screen con tale opzione:

$ screen -e ^Ss

o inserire escape ^Ss nel file di configurazione.


Split

Una delle caratteristiche principali di screen è la possibilità di dividere la finestra in più porzioni proprio come un Window Manager tiling o gli split di Vim, queste prendono il nome di regioni.
Per dividere orizzontalmente si usa:

Ctrl-a S

Mentre per lo split verticale:

Ctrl-a |

A questo punto la regione in focus è trattata come una finestra, perché questo è lo scopo degli split: avere più finestre a vista contemporaneamente. Le scorciatoie per cambiare finestra sono le stesse ma valgono solo per quella regione, per muoversi invece tra una regione e l'altra useremo la combinazione:

Ctrl-a TAB

Di default abbiamo solo questa e le regioni vengono selezionate in senso orario ma possiamo associare altri comandi per muoverci in senso antiorario e spostarsi alla regione in alto o in basso; ma è forse necessaria qualche piccola considerazione.
screen è un programma con una certa età e il suo sviluppo è piuttosto stagnante, nonostante sia abbastanza attivo su Git non esce una nuova versione da anni. La divisione orizzontale è di serie solo su Debian e derivate, per tutti gli altri è necessario applicare una patch o compilarselo da Git, tutto sommato è una feature piuttosto recente e porta alla conseguenza che alcuni comandi non sono stati adattati allo scopo. Ad esempio non ci si può spostare a destra e sinistra (non facilmente almeno) perché esistono solo i comandi up e down.
Da parecchio ormai esiste questo tipico confronto tra applicazioni simili per scoprire quale sia meglio o peggio, la verità è che una non sostituisce l'altra o se lo fa dipende dalle esigenze del singolo; in particolare sto parlando di "screen vs tmux" e "irssi vs weechat". Visto che sono programmi che necessitano di impegno nel capirne il funzionanemto, ciò che salta subito all'occhio in tmux e weechat è la ricchezza di feature abilitate in modo predefinito, questo non è necessariamente un pregio ma nemmeno un difetto, provateli entrambi e valutate.


In caso volessimo rimuovere la regione in focus useremo:

Ctrl-a X

Se invece decidiamo di rimuoverle tutte tranne quella in focus:

Ctrl-a Q

La rimozione di una regione non implica eliminare la finestra o chiudere il programma ma solamente eliminare lo split.

Ogni regione è ridimensionabile in base all'orientamento dello split:

Ctrl-a :resize valore

dove "valore" è la quantità di righe o colonne desiderata o una percentuale dello spazio totale.

  • incrementa regione in focus: +valore
  • diminuisce regione in focus: -valore
  • imposta tutte le finestre alla stessa dimensione: =
  • massimizza regione in focus: max
  • minimizza regione in focus: min

Quando facciamo il detach della sessione e la riattacchiamo, gli split spariscono, questo salverà la disposizione delle regioni per la sessione corrente:

Ctrl-a :layout save nome_a_piacere

Una volta salvato il layout il ripristino è automatico ma questo è comunque il comando per ripristinarlo:

Ctrl-a :layout attach nome_usato_per_salvare

Possiamo avere e salvare più layout ed elencarli con:

Ctrl-a :layout show

Eventualmente rinominarli (senza argomento mostra il nome di quello in uso):

Ctrl-a :layout title nome_usato_per_salvare

E naturalmente rimuoverlo:

Ctrl-a :layout remove nome_usato_per_salvare

La versione di Debian è compilata da Git ed ha varie opzioni non solitamente presenti, a questa manca ancora layout dump che permette di salvare la disposizione su file di configurazione e renderlo disponibile anche dopo la chiusura della sessione.
Inoltre non sono comandi documentati, per cui date un'occhiata ai sorgenti.


Copia e incolla

La gestione del testo è una delle caratteristiche più importanti e potenti, sebbene sia usabile in un emulatore di terminale e in X, ricordiamoci che screen nasce come applicazione mouseless ed è qundi provvista di tutto (o quasi) ciò che serve per renderla funzionale senza click.

Per copiare del testo si entra in modalità copia:

Ctrl-a [

Quindi ci si muove con le frecce o meglio ancora con i tasti tipici di Vim; vi rimando alla manpage per il comando copy che elenca e spiega il tutto e riporto solo qualche piccolo esempio.

Supponiamo si voglia copiare la frase precedente. Attiviamo la modalità copia quindi scorriamo nel testo con h, j, k, l spostando il cursore sulla Q di "Quindi" e premiamo il tasto Space; ora sempre con i tasti di movimento raggiungiamo la fine della frase (w, b scorrono parola per parola e velocizzano l'operazione), possiamo vedere che il testo viene selezionato. Una volta che il cursore raggiungerà o. di "esempio" premiamo di nuovo Space che, come è intuibile, fa da marcatore per inizio e fine; sulla statusbar apparirà il messaggio "Copied 195 characters into buffer". Ora abbiamo la nostra frase memorizzata nella selezione, premiamo Esc o altro tasto (qualsiasi altro tasto che non faccia parte di quelli elencati per le operazioni) per uscire dalla modalità copia, ci spostiamo su un'altra finestra, che sia un prompt bash o un editor, e incolliamo con:

Ctrl-a ]

È un po' macchinoso ma davvero potente, in particolare quando si deve copiare una quantità corposa di testo.
Possiamo salvare la nostra selezione su file senza dover aprire prima un editor. Ripetiamo il procedimento di prima per la copia ma invece di spostarsi altrove e incollare usiamo questa combinazione:

Ctrl-a >

Apparirà il messaggio "Copybuffer written to "/tmp/screen-exchange"" e in tale file avremo la nostra frase.
Il percorso del file /tmp/screen-exchange è modificabile tramite il comando bufferfile, sia per salvare la selezione altrove sia per incollare da altra fonte; ora vediamo infatti come sfruttare questo file di scambio o attingere da uno differente.
Apriamo Vim (o altro editor) e mettiamolo in modalità inserimento, ora facciamo leggere il file a screen con:

Ctrl-a <

Apparirà il messaggio "Slurped 195 characters into buffer". Quindi incolliamo con Ctrl-a ] ottenendo il testo contenuto in /tmp/screen-exchange.
Adesso vogliamo invece incollare nell'editor il contenuto di un file differente, impostiamo quindi il percorso come argomento del comando bufferfile, lo segnaliamo a screen e incolliamo:

C-a :bufferfile /etc/screenrc
C-a < C-a ]
C-a :bufferfile

L'ultima riga è davvero importante perché riattiviamo il file predefinito per lo scambio /tmp/screen-exchange, altrimenti utilizzando successivamente Ctrl-a > verrà usato /etc/screenrc e, sebbene non avremo i permessi per scriverci, di certo non lo vogliamo; se il file fosse un altro e ne avessimo accesso in scrittura, questo verrebbe sovrascritto. Usate questo sistema con prudenza.



Configurazione



skizzhg ven 14 ott 2011, 19.34.46, CEST