GNU/Screen: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
m
versioni compatibili
mNessun oggetto della modifica
m (versioni compatibili)
 
(16 versioni intermedie di 4 utenti non mostrate)
Riga 1: Riga 1:
{{Stub}}
{{Versioni compatibili|Wheezy|Jessie|Testing_2016|Unstable_2016}}
== Introduzione ==
== Introduzione ==
<code>GNU/Screen</code> è 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.<BR>
<code>GNU/Screen</code> è 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.
 
Risulta dunque lampante la sua utilità in sistemi privi di ambiente grafico, dove non è appunto possibile avviare N finestre di terminale per eseguire N differenti applicativi/comandi.
Risulta dunque lampante la sua utilità in sistemi privi di ambiente grafico, dove non è appunto possibile avviare N finestre di terminale per eseguire N differenti applicativi/comandi.


== Installazione ==
== Installazione ==
Come sempre Debian rende tutto molto semplice:
Come sempre il sistema [[APT]] di Debian rende tutto molto semplice. Con [[privilegi di amministrazione]] è sufficiente:
<pre># aptitude install screen</pre>
<pre># apt-get install screen</pre>


== Utilizzo ==
== Utilizzo ==
<code>GNU/Screen</code> ha due tipi di utilizzo, tramite interfaccia e tramite riga di comando; premesso che visivamente la differenza è minima si può affermare che la prima modalità risulta prevalentemente utile in tutti quei casi dove è richiesta interazione con l'utente, mentre la seconda dove ciò non è vero, per esempio nell'esecuzione di script o di servizi come CRON.
<code>GNU/Screen</code> ha due tipi di utilizzo, tramite interfaccia e tramite riga di comando; premesso che visivamente la differenza è minima si può affermare che la prima modalità risulta prevalentemente utile in tutti quei casi dove è richiesta interazione con l'utente, mentre la seconda dove ciò non è vero, per esempio nell'esecuzione di script o di servizi come [[Cron|Cron]].
Concretamente screen una volta avviato non fa altro che duplicare la schermata del terminale, quindi da un punto di vista visivo, ad eccezione del messaggio iniziale, non si noterà alcunché di differente rispetto al classico terminale. Ciò nonostante tutti gli eventuali comandi ed operazioni generiche eseguiti apparterrano esclusivamente al suddetto duplicato del terminale, "lasciando dunque libero" quello di base.
Concretamente screen una volta avviato non fa altro che duplicare la schermata del terminale, quindi da un punto di vista visivo, ad eccezione del messaggio iniziale, non si noterà alcunché di differente rispetto al classico terminale. Ciò nonostante tutti gli eventuali comandi ed operazioni generiche eseguiti apparterranno esclusivamente al suddetto duplicato del terminale, "lasciando dunque libero" quello di base.<br/>
Questo fatto in congiunzione con la possibilità di "abbandonare" il duplicato senza che questo comporti la terminazione di tutte le operazioni in corso permette di eseguire comodamente più operazioni in parallelo, basta infatti creare tanti duplicati quanti ne servono.
Questo fatto in congiunzione con la possibilità di "abbandonare" il duplicato senza che questo comporti la terminazione di tutte le operazioni in corso permette di eseguire comodamente più operazioni in parallelo, basta infatti creare tanti duplicati quanti ne servono.<br/>
In ogni momento è sempre possibile ricollegarsi ad una o più sessioni di <code>GNU/Screen</code> e riprendere le varie attività come se niente fosse.
In ogni momento è sempre possibile ricollegarsi ad una o più sessioni di <code>GNU/Screen</code> e riprendere le varie attività come se niente fosse.


Riga 17: Riga 18:
Per avviare <code>GNU/Screen</code> è sufficiente digitare in un emulatore di terminale o in una tty quanto segue:
Per avviare <code>GNU/Screen</code> è sufficiente digitare in un emulatore di terminale o in una tty quanto segue:
<pre>$ screen</pre>
<pre>$ screen</pre>
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.
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.<br/>
Nel seguito si spiegherà come abbandonare e ricollegarsi ad una sessione di <code>GNU/Screen</code> già esistente, per il momento ci si limita a sottolineare come ripetendo il precedente comando si crei una nuova sessione senza quindi ricollegarsi ad una già esistente. Ne segue immediatamente che utilizzando scorrettamente <code>GNU/Screen</code> si rischia di ritrovarsi con un certo numero di sessioni abbandonate.
Nel seguito si spiegherà come abbandonare e ricollegarsi ad una sessione di <code>GNU/Screen</code> già esistente, per il momento ci si limita a sottolineare come ripetendo il precedente comando si crei una nuova sessione senza quindi ricollegarsi ad una già esistente. Ne segue immediatamente che utilizzando scorrettamente <code>GNU/Screen</code> si rischia di ritrovarsi con un certo numero di sessioni abbandonate.
{{Box|NOTA|È possibile creare '''m''' sessioni di <code>GNU/Screen</code> e per ciascuna di esse '''n''' schermi}}
{{Box|NOTA|È possibile creare '''m''' sessioni di <code>GNU/Screen</code> e per ciascuna di esse '''n''' schermi}}
Riga 25: Riga 26:


Innanzitutto rendiamoci la vita facile con la fantomatica statusbar, all'interno di screen digitate:
Innanzitutto rendiamoci la vita facile con la fantomatica statusbar, all'interno di screen digitate:
Ctrl-a :
<pre>Ctrl-a :</pre>


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.
Il cursore si sposterà al fondo dove appariranno i due punti, questo è il prompt dei comandi, per intenderci è simile alla modalità comando di [[Vim Cheat Sheet|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:
A questo punto, subito dopo i due punti, scriviamo:
hardstatus alwayslastline
<pre>hardstatus alwayslastline</pre>


e premiamo Invio. <br>
e premiamo Invio. <br>
Ora abbiamo una barra di stato, configuriamola in modo da avere un riscontro visivo delle finestre, questa volta dal prompt bash digitiamo:
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)"
<pre>$ screen -X hardstatus string "$(man screen | grep %-L)"</pre>


Invece del prompt di screen abbiamo usato la riga di comando, sia per mostrarvi un'altra caratteristica sia per la sua versatilità; questi due sistemi non sempre sono uno l'alternativa dell'altro, l'opzione <code>'''-X'''</code> è particolarmente usata in script o per inviare comandi più complessi, è inoltre utilizzabile dall'esterno della sessione per inviare comandi remoti.
Invece del prompt di screen abbiamo usato la riga di comando, sia per mostrarvi un'altra caratteristica sia per la sua versatilità; questi due sistemi non sempre sono uno l'alternativa dell'altro, l'opzione <code>'''-X'''</code> è 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ì:
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%<
<pre>%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<</pre>


==== Scorciatoie e messaggi ====
==== 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:
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
<pre>Ctrl-a c</pre>


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


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


Una breve legenda con le eventuali combinazioni create e quindi presenti nel file di configurazione si ottiene con:
Una breve legenda con le eventuali combinazioni create e quindi presenti nel file di configurazione si ottiene con:
Ctrl-a ?
<pre>Ctrl-a ?</pre>


Ogni finestra è rinominabile a piacimento con:
Ogni finestra è rinominabile a piacimento con:
Ctrl-a A
<pre>Ctrl-a A</pre>


Al prompt dei comandi apparirà la scritta "Set window's title to: bash", basta cancellare il nome attuale e scrivere il desiderato.
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:
E se vogliamo rinumerarla:
Ctrl-a :number  
<pre>Ctrl-a :number</pre>


seguito da uno spazio e il nuovo numero.
seguito da uno spazio e il nuovo numero.


Per chiudere un singolo schermo è possibile digitare
Per chiudere una singola finestra è possibile digitare:
<pre>$ exit</pre>
<pre>$ exit</pre>
oppure '''solo''' in caso di problemi quali congelamento dello schermo o altro è possibile forzarne la chiusura (e uccidere il processo) con:
oppure '''solo''' in caso di problemi quali congelamento dello schermo o altro è possibile forzarne la chiusura (e uccidere il processo) con:
Ctrl-a k
<pre>Ctrl-a k</pre>
Al prompt dei comandi apparirà il messaggio "Really kill this window [y/n]".
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):
Visualizza data, hostname e carico del sistema (load average, quello solitamente mostrato dal comando uptime):
Ctrl-a t
<pre>Ctrl-a t</pre>


Il messaggio apparirà in basso, sopra la statusbar, per alcuni secondi; per visualizzare l'ultimo messaggio di attività, qualunque esso sia, si usa:
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
<pre>Ctrl-a m</pre>


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 <code>''%n''</code> è sostituito dal numero della finestra. <br>
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 <code>''%n''</code> è sostituito dal numero della finestra. <br>
Riga 91: Riga 92:
La risposta è che è impossibile chiudere screen, non è stato concepito per essere terminato, perché usarlo altrimenti? ;) <br>
La risposta è che è impossibile chiudere screen, non è stato concepito per essere terminato, perché usarlo altrimenti? ;) <br>
Ma se proprio non potete farne a meno:
Ma se proprio non potete farne a meno:
Ctrl-a C-\
<pre>Ctrl-a C-\</pre>


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 <code>Ctrl-a Ctrl-\</code> ma se volete davvero evitare brutte sorprese consiglio vivamente di eliminarla e usare il prompt quando occorre:
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 <code>Ctrl-a Ctrl-\</code> ma se volete davvero evitare brutte sorprese consiglio vivamente di eliminarla e usare il prompt quando occorre:
Ctrl-a :quit
<pre>Ctrl-a :quit</pre>


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]".
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]".
Riga 100: Riga 101:
==== Detach e sessioni ====
==== Detach e sessioni ====
Come anticipato inizialmente GNU/Screen deve restare attivo e insieme a lui tutto ciò che contiene anche nei seguenti casi:
Come anticipato inizialmente GNU/Screen deve restare attivo e insieme a lui tutto ciò che contiene anche nei seguenti casi:
* logout (locale o via SSH) dell'utente;
* logout (locale o via [[SSH]]) dell'utente;
* riavvio di X o chiusura del terminale (se si dispone di un ambiente grafico);
* riavvio di X o chiusura del terminale (se si dispone di un ambiente grafico);
* altre operazioni esotiche eccettuato il riavvio della macchina;
* altre operazioni esotiche eccettuato il riavvio della macchina.
Tutto ciò è reso possibile grazie alla funzione di ''detach'', ovvero la possibilità di "staccare" GNU/Screen da quello che è di fatto il suo contenitore, xterm o tty che sia:
Tutto ciò è reso possibile grazie alla funzione di ''detach'', ovvero la possibilità di "staccare" GNU/Screen da quello che è di fatto il suo contenitore, Xterm o tty che sia:
Ctrl-a d
<pre>Ctrl-a d</pre>


Per ricollegarsi ("riattaccarsi") allo specifico schermo di una certa sessione da cui ci si è precedentemente staccati è sufficiente digitare  
Per ricollegarsi ("riattaccarsi") alla specifica finestra di una certa sessione da cui ci si è precedentemente staccati è sufficiente digitare:
$ screen -r nome_sessione -p nome_schermo
<pre>$ screen -r nome_sessione -p nome_finestra</pre>
dove <code>nome_sessione</code> è appunto il nome della nostra sessione e <code>nome_schermo</code> quello dello schermo desiderato (al posto del nome è anche possibile utilizzare il numero dello schermo, ricordando a tal proposito che la numerazione parte dal valore 0). Qualora sia presente un unica sessione ed un unico schermo è possibile omettere sia <code>nome_sessione</code> sia <code>-p nome_schermo</code>. In caso contrario l'omissione di tali parametri innesca la stampa a video delle sessioni disponibili, per esempio:
dove <code>nome_sessione</code> è appunto il nome della nostra sessione e <code>nome_finestra</code> quello della finestra desiderata (al posto del nome è anche possibile utilizzare il numero della finestra, ricordando a tal proposito che la numerazione parte dal valore 0). Qualora sia presente un'unica sessione ed un'unica finestra è possibile omettere sia <code>nome_sessione</code> sia <code>-p nome_finestra</code>. In caso contrario l'omissione di tali parametri innesca la stampa a video delle sessioni disponibili, per esempio:
<pre>
<pre>
$ screen -r
$ screen -r
Riga 120: Riga 121:
I primi due nomi di sessioni sono stati generati automaticamente, infatti i nomi predefiniti in GNU/Screen hanno la seguente struttura:
I primi due nomi di sessioni sono stati generati automaticamente, infatti i nomi predefiniti in GNU/Screen hanno la seguente struttura:
<pre>numero.pts-numero.hostname</pre>
<pre>numero.pts-numero.hostname</pre>
L'ultimo nome è frutto invece della scelta dell'utente, almeno per quanto riguarda la parte successiva al punto.
L'ultimo nome è frutto invece della scelta dell'utente, almeno per quanto riguarda la parte successiva al punto.<br/>
Si noti che l'omissione del parametro <code>-p</code>, ovvero del nome schermo, viene interpretato da GNU/Screen come una richiesta di collegarsi all'ultimo schermo utilizzato.
Si noti che l'omissione del parametro <code>-p</code>, ovvero del nome finestra, viene interpretato da GNU/Screen come una richiesta di collegarsi all'ultima finestra utilizzata.<br/>
Supponendo dunque di voler richiamare la prima sessione è possibile digitare uno tra i seguenti tre comandi:
Supponendo dunque di voler richiamare la prima sessione è possibile digitare uno tra i seguenti tre comandi:
$ screen -r 4322.pts-17.jackinthebox
<pre>$ screen -r 4322.pts-17.jackinthebox
$ screen -r 4322
$ screen -r 4322
$ screen -r pts-17
$ screen -r pts-17
</pre>
Similmente per l'ultima sessione sarà possibile ricollegarvisi digitando:
Similmente per l'ultima sessione sarà possibile ricollegarvisi digitando:
$ screen -r fugu
<pre>$ screen -r fugu</pre>


Per personalizzarne il nome di una sessione direttamente in fase d'avvio è sufficiente digitare:
Per personalizzarne il nome di una sessione direttamente in fase d'avvio è sufficiente digitare:
$ screen -S fugu
<pre>$ screen -S fugu</pre>


Se invece volessimo attaccare in un altro terminale o tty una sessione già attaccata useremo:
Se invece volessimo attaccare in un altro terminale o tty una sessione già attaccata useremo:
$ screen -x
<pre>$ screen -x</pre>
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.
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.
{{Warningbox|Prestare cautela nell'eseguire all'interno di sessioni screen l'utilizzo dell'opzione "-x".}}
{{Warningbox|Prestare cautela nell'eseguire all'interno di sessioni screen l'utilizzo dell'opzione "-x".}}
La variabile d'ambiente '''STY''' permette di verificare se Screen è in esecuzione. Se ad esempio lo si volesse avviare al login è possibile inserire nel file <code>~/.bashrc</code> quanto segue:
<pre>
if [ -z "$STY" ]; then
  screen -R
fi
</pre>
Che significa: se già esiste una sessione attaccala, altrimenti creane una.


==== Escape ====
==== Escape ====
Utilizzando <code>Ctrl-a</code> 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:
Utilizzando <code>Ctrl-a</code> 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  
<pre>Ctrl-a a </pre>


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:
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
<pre>$ screen -e ^Ss</pre>


o inserire <code>'''escape ^Ss'''</code> nel file di configurazione.
o inserire <code>'''escape ^Ss'''</code> nel file di configurazione.
Riga 149: Riga 159:
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. <br>
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. <br>
Per dividere orizzontalmente si usa:
Per dividere orizzontalmente si usa:
Ctrl-a S
<pre>Ctrl-a S</pre>


Mentre per lo split verticale:
Mentre per lo split verticale:
Ctrl-a |
<pre>Ctrl-a |</pre>


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:
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
<pre>Ctrl-a TAB</pre>


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. <br>
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. <br>
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''. <br>
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''. <br>
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.
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 funzionamento, 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.


Notare che lo split prende il focus ma non crea o sceglie alcuna finestra, solo lo spazio dove contenere qualcosa.
Notare che lo split prende il focus ma non crea o sceglie alcuna finestra, solo lo spazio dove contenere qualcosa.


In caso volessimo rimuovere la regione in focus useremo:
In caso volessimo rimuovere la regione in focus useremo:
Ctrl-a X
<pre>Ctrl-a X</pre>


Se invece decidiamo di rimuoverle tutte tranne quella in focus:
Se invece decidiamo di rimuoverle tutte tranne quella in focus:
Ctrl-a Q
<pre>Ctrl-a Q</pre>


La rimozione di una regione non implica eliminare la finestra o chiudere il programma ma solamente eliminare lo split.
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:  
Ogni regione è ridimensionabile in base all'orientamento dello split:  
Ctrl-a :resize valore
<pre>Ctrl-a :resize valore</pre>


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


Quando facciamo il detach della sessione e la riattacchiamo, gli split spariscono, questo salverà la disposizione delle regioni per la sessione corrente:
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
<pre>Ctrl-a :layout save nome_a_piacere</pre>


Una volta salvato il layout il ripristino è automatico ma questo è comunque il comando per ripristinarlo:
Una volta salvato il layout il ripristino è automatico ma questo è comunque il comando per ripristinarlo:
Ctrl-a :layout attach nome_usato_per_salvare
<pre>Ctrl-a :layout attach nome_usato_per_salvare</pre>


Possiamo avere e salvare più layout ed elencarli con:
Possiamo avere e salvare più layout ed elencarli con:
Ctrl-a :layout show
<pre>Ctrl-a :layout show</pre>


Eventualmente rinominarli (senza argomento mostra il nome di quello in uso):
Eventualmente rinominarli (senza argomento mostra il nome di quello in uso):
Ctrl-a :layout title nome_usato_per_salvare
<pre>Ctrl-a :layout title nome_usato_per_salvare</pre>


E naturalmente rimuoverlo:
E naturalmente rimuoverlo:
Ctrl-a :layout remove nome_usato_per_salvare
<pre>Ctrl-a :layout remove nome_usato_per_salvare</pre>


La versione di Debian è compilata da Git e ha varie opzioni non solitamente presenti, a questa manca ancora <code>layout dump</code> che permette di salvare la disposizione su file di configurazione e renderlo disponibile anche dopo la chiusura della sessione. <br>
La versione di Debian è compilata da Git e ha varie opzioni non solitamente presenti, a questa manca ancora <code>layout dump</code> che permette di salvare la disposizione su file di configurazione e renderlo disponibile anche dopo la chiusura della sessione. <br>
Riga 200: Riga 210:


==== Copia e incolla ====
==== 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.
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 è quindi provvista di tutto (o quasi) ciò che serve per renderla funzionale senza click.


Per copiare del testo si entra in modalità copia:
Per copiare del testo si entra in modalità copia:
Ctrl-a [
<pre>Ctrl-a [</pre>


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.
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:
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 ]
<pre>Ctrl-a ]</pre>


È un po' macchinoso ma davvero potente, in particolare quando si deve copiare una quantità corposa di testo. <br>
È un po' macchinoso ma davvero potente, in particolare quando si deve copiare una quantità corposa di testo. <br>
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:
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 >
<pre>Ctrl-a ></pre>


Apparirà il messaggio "Copybuffer written to "/tmp/screen-exchange"" e in tale file avremo la nostra frase. <br>
Apparirà il messaggio "Copybuffer written to "/tmp/screen-exchange"" e in tale file avremo la nostra frase. <br>
Il percorso del file <code>/tmp/screen-exchange</code> è modificabile tramite il comando <code>'''bufferfile'''</code>, 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. <br>
Il percorso del file <code>/tmp/screen-exchange</code> è modificabile tramite il comando <code>'''bufferfile'''</code>, 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. <br>
Apriamo Vim (o altro editor) e mettiamolo in modalità inserimento, ora facciamo leggere il file a screen con:
Apriamo Vim (o altro editor) e mettiamolo in modalità inserimento, ora facciamo leggere il file a screen con:
Ctrl-a <
<pre>Ctrl-a <</pre>


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


L'ultima riga è '''davvero importante''' perché riattiviamo il file predefinito per lo scambio <code>/tmp/screen-exchange</code>, altrimenti utilizzando successivamente <code>Ctrl-a ></code> verrà usato <code>/etc/screenrc</code> 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 cautela.
L'ultima riga è '''davvero importante''' perché riattiviamo il file predefinito per lo scambio <code>/tmp/screen-exchange</code>, altrimenti utilizzando successivamente <code>Ctrl-a ></code> verrà usato <code>/etc/screenrc</code> 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 cautela.


Oltre a questo possiamo fare un dump di ciò che è contenuto nello schermo (la parte visibile del buffer) senza bisogno di scroll:
Oltre a questo possiamo fare un dump di ciò che è contenuto nello schermo (la parte visibile del buffer) senza bisogno di scroll:
Ctrl-a h
<pre>Ctrl-a h</pre>


Apparirà il messaggio "Screen image written to hardcopy.n"", dove '''n''' sarà il numero della finestra; il file è creato in PWD, il path da dove è stato avviato screen. Se l'opzione '''hardcopy_append on''' non è specificata, il file viene sovrascritto ad ogni utilizzo.
Apparirà il messaggio "Screen image written to hardcopy.n"", dove '''n''' sarà il numero della finestra; il file è creato in PWD, il [[path]] da dove è stato avviato screen. Se l'opzione '''hardcopy_append on''' non è specificata, il file viene sovrascritto ad ogni utilizzo.


=== Modalità riga di Comando ===
=== Modalità riga di Comando ===
Come inizialmente anticipato è possibile sia inviare comandi sia eseguire applicativi in ciascuno dei vari schermi di <code>GNU/Screen</code> precedentemente creati senza per questo essere obbligati a riportare in primo piano ciascuno di essi.
Come inizialmente anticipato è possibile sia inviare comandi sia eseguire applicativi in ciascuno dei vari schermi di <code>GNU/Screen</code> precedentemente creati senza per questo essere obbligati a riportare in primo piano ciascuno di essi.
Si noti che terminata l'esecuzione del comando ci si ritroverà ancora davanti al proprio terminale "base" oppure in uno schermo <code>GNU/Screen</code> appartenente ad una differente sessione.
Si noti che terminata l'esecuzione del comando ci si ritroverà ancora davanti al proprio terminale "base" oppure in una finestra <code>GNU/Screen</code> appartenente ad una differente sessione.
<br>


Creare una sessione di nome ''sessione1''
Creare una sessione di nome ''sessione1''
<pre>screen -m -d -S sessione1</pre>
<pre>$ screen -m -d -S sessione1</pre>


Selezionare una finestra (accetta sia il numero sia il nome):
Selezionare una finestra (accetta sia il numero sia il nome):
$ screen -X select 1
<pre>$ screen -X select 1</pre>


Rinumerare finestra (-p accetta sia il numero sia il nome):
Rinumerare finestra (-p accetta sia il numero sia il nome):
$ screen -p 9 -X number 11
<pre>$ screen -p 9 -X number 11</pre>


Rinominare finestra:
Rinominare finestra:
$ screen -p 9 -X title zut
<pre>$ screen -p 9 -X title zut</pre>
 
Eseguire un comando generico all'interno di una finestra usando  il comando '''stuff''', il quale concretamente invia una stringa come input. Esempi:
 
Elencare il contenuto di una cartella tramite '''ls''' (^M si ottiene premendo <code>ctrl-v</code> e subito dopo <code>Invio</code> o <code>Return</code> che dir si voglia):
<pre>$ screen -S nome_sessione -p nome_finestra -X stuff 'ls ^M'</pre>
 
(si veda il paragrafo ''Detach e Sessioni'' per il significato dei parametri <code>nome_sessione</code> e <code>nome_finestra</code>). Alternativamente (utile per situazioni in cui ''^M'' non è applicabile):
<pre>$ screen -S nome_sessione -p nome_finestra -X stuff $'ls\n'</pre>
 
Nel caso in cui GNU/Screen debba essere richiamato all'interno di script o per l'utilizzo in congiunzione con CRON è necessario usare <code>eval</code>; per esempio:
<pre>
$ screen -X eval 'stuff comando "parametri \012"'
$ screen -X eval 'stuff ./mio_script.sh "parametri_script \012"'
</pre>


Eseguire un comando generico all'interno di uno schermo usando  il comando '''stuff''', il qualche concretamente invia una stringa come input. Esempi:
Eseguire un comando generico all'interno di più finestre usando  il comando '''at'''. Esempi.


Elencare il contenuto di una cartella tramite '''ls''' (^M si ottiene con <code>ctrl-v Return</code>):
Elencare il contenuto di una directory tramite '''ls''' in tutte le finestre chiamate bash:
$ screen -S nome_sessione -p nome_schermo -X stuff 'ls ^M'
<pre>$ screen -X at bash# stuff 'ls ^M'</pre>
(si veda il paragrafo ''Detach e Sessioni'' per il significato dei parametri <code>nome_sessione</code> e <code>nome_schermo</code>). Alternativamente (utile per script o altre situazioni in cui ''^M'' non è applicabile):
Elencare il contenuto di una directory tramite '''ls''' in tutte le finestre chiamate <code>bash</code> e alla finestra <code>l10n</code>:
$ screen -S nome_sessione -p nome_schermo -X stuff $'ls\n'
<pre>$ screen -X eval 'at bash# stuff "ls ^M"' 'at l10n# stuff "ls ^M"'</pre>


Eseguire un comando generico all'interno di più schermi usando  il comando '''at'''. Esempi
Elencare il contenuto di una directory tramite il comando '''ls''' nelle finestre zero e nove:
<pre>$ screen -X eval 'at 0# stuff "ls ^M"' 'at 9# stuff "ls ^M"'</pre>


Elencare il contenuto di una cartella tramite '''ls''' in tutte le finestre chiamate bash:
Elencare il contenuto di una directory tramite '''ls''' in tutte le finestre:
$ screen -X at bash# stuff 'ls ^M'
<pre>$ screen -X at \# stuff 'ls ^M'</pre>
Elencare il contenuto di una cartella tramite '''ls''' in tutte le finestre chiamate bash e alla finestra l10n:
$ screen -X eval 'at bash# stuff "ls ^M"' 'at l10n# stuff "ls ^M"'


Elencare il contenuto di una cartella tramite il comando '''ls''' nelle finestre zero e nove:
Possiamo inviare una sequenza ad un programma contenuto in una finestra (^Q si ottiene premendo <code>ctrl-v</code> e <code>ctrl-q</code>):
$ screen -X eval 'at 0# stuff "ls ^M"' 'at 9# stuff "ls ^M"'
<pre>$ screen -p 7 -X stuff ^Q </pre>


Elencare il contenuto di una cartella tramite '''ls''' in tutte le finestre:
nella finestra 7 ho solitamente <code>rtorrent</code>, gli verrà quindi inviato <code>Ctrl-q</code> che chiuderà il programma in modo pulito, utilizzabile eventualmente in coppia con il comando <code>sleep</code> per programmarne la chiusura.
$ screen -X at \# stuff 'ls ^M'


== Configurazione ==
== Configurazione ==
Riga 292: Riga 313:
  deflogin on
  deflogin on


# abilito il monitoraggio di attività delle finestre
# abilito il monitoraggio di attività delle finestre  
(i messaggi di attività spiegati al capitolo 3.1.2: Scorciatoie e messaggi)
# (i messaggi di attività spiegati al capitolo 3.1.2: Scorciatoie e messaggi)
  defmonitor on
  defmonitor on


Riga 410: Riga 431:
  bind T screen -t rTorr 7 rtorrent
  bind T screen -t rTorr 7 rtorrent
  bind V screen 5 vim
  bind V screen 5 vim
  bind W screen w3m http://it.search.yahoo.com
  bind W screen w3m https://www.google.com


# automatizzo certe operazioni all'apertura di screen, consideratelo come il file di startup di un DE/WM
# automatizzo certe operazioni all'apertura di screen, consideratelo come il file di startup di un DE/WM
Riga 427: Riga 448:


Dopo aver fatto modifiche al file di configurazione possiamo ricaricarlo senza chiudere la sessione:
Dopo aver fatto modifiche al file di configurazione possiamo ricaricarlo senza chiudere la sessione:
Ctrl-a :source .screenrc
<pre>Ctrl-a :source .screenrc</pre>


== Risorse ==
== Risorse ==
* http://dotfiles.org/.screenrc
* http://www.softpanorama.org/Utilities/Screen/screenrc_examples.shtml
* http://aperiodic.net/screen/
* http://aperiodic.net/screen/


{{Autori
|Autore=[[Utente:Skizzhg|skizzhg]] ven 14 ott 2011, 19.34.46, CEST
}}


[[Utente:Skizzhg|skizzhg]] ven 14 ott 2011, 19.34.46, CEST
----
[[Categoria:Shell]]
[[Categoria:Shell]]
[[Categoria:Window Manager]]
[[Categoria:Window Manager]]
3 581

contributi

Menu di navigazione