Una sessione che non muore
Il motivo per cui esiste tmux non è dividere lo schermo: è staccare il terminale dai programmi che ci girano dentro. Chiudi il portatile, cade la rete, riapri domani, e il lavoro è ancora lì.
Quattro cose, una dentro l'altra
Il nome sta per terminal multiplexer. In pratica tmux si mette in mezzo tra il terminale che vedi e i programmi che lanci: i programmi parlano con tmux, tmux parla con il terminale. Se il terminale se ne va, i programmi non se ne accorgono nemmeno.
Da questa idea discende una gerarchia di quattro livelli, e quasi ogni difficoltà dei primi giorni nasce dal confonderli.
| Livello | Che cos'è |
|---|---|
| server | un processo solo, avviato da solo al primo comando. Contiene tutto il resto. Non lo vedi quasi mai. |
| sessione | uno spazio di lavoro con un nome. È la cosa che sopravvive: ti ci attacchi e ti ci stacchi. |
| finestra | una schermata intera dentro la sessione, come una scheda del browser. Numerata da 0. |
| pannello | un riquadro dentro una finestra. Ogni pannello ha la sua shell. |
server tmux └─ sessione "sito" ├─ finestra 0: editor │ ├─ pannello 0.0 # vim │ └─ pannello 0.1 # git status, test ├─ finestra 1: server │ └─ pannello 1.0 # npm run dev, sempre acceso └─ finestra 2: log ├─ pannello 2.0 # tail -f access.log └─ pannello 2.1 # tail -f error.log
La riga colorata in fondo allo schermo è la status bar: a sinistra il nome della sessione, al centro l'elenco delle finestre con quella attiva evidenziata, a destra l'ora. In questo corso la trovi ridisegnata sopra i blocchi di comandi, per farti vedere dove ti porta ogni tasto.
tmux, screen, e il terminale che hai già
Se il tuo emulatore di terminale ha già le schede e i riquadri, tmux sembra un doppione. La differenza è dove vive la sessione: le schede del terminale stanno sul tuo computer e muoiono con la finestra, quelle di tmux stanno sulla macchina dove tmux gira — spesso un server remoto — e restano. È anche il motivo per cui tmux e le schede native convivono male: scegline uno.
Rispetto a GNU Screen, che fa la stessa cosa dal 1987, tmux è più giovane, ha una configurazione più leggibile e un modello a comandi più regolare. Se erediti un server con Screen già impostato non c'è fretta di cambiare; se parti da zero, tmux.
Entrare, staccarsi, tornare
$ sudo apt install tmux # debian, ubuntu $ sudo dnf install tmux # fedora, rocky $ brew install tmux # macos $ tmux -V # verifica: da 3.0 in su sei tranquillo
La versione conta più di quanto sembri: diverse opzioni hanno cambiato nome nel passaggio alla 3.x, e le guide trovate in rete spesso si riferiscono alla 2.x. Quando un comando non funziona, controlla prima di tutto il numero di versione.
| Comando | Effetto |
|---|---|
| tmux | avvia il server e crea una sessione senza nome (0, 1, 2…) |
| tmux new -s sito | crea una sessione chiamata «sito» — fallo sempre, i nomi servono |
| tmux ls | elenca le sessioni esistenti |
| tmux attach -t sito | si riattacca a quella sessione · in breve tmux a -t sito |
| tmux kill-session -t sito | la chiude per davvero |
| exit | chiude il pannello · quando finiscono i pannelli, finisce la sessione |
Il gesto che vale il corso intero
Staccarsi da una sessione si fa con prefix seguito da d — dove prefix è la combinazione Ctrl+b, di cui parla per esteso la lezione 2. Premuti in sequenza, non insieme: prima Ctrl-b, poi si lascia, poi d.
$ ssh utente@server $ tmux new -s deploy # lanci un aggiornamento che dura quaranta minuti $ ./aggiorna-tutto.sh prefix d # ti stacchi: lo script continua [detached (from session deploy)] $ exit # chiudi pure l'ssh, e il portatile # tre ore dopo, da un altro computer $ ssh utente@server $ tmux ls deploy: 1 windows (created Sat Sep 12 09:14:02 2026) $ tmux a -t deploy # sei esattamente dove avevi lasciato
nohup e screen
hanno sempre cercato di aggirare — con tmux non si pone, perché i tuoi processi
non sono figli della sessione SSH ma del server tmux, che resta acceso.
new -A: un comando solo, sempre lo stesso
Il fastidio quotidiano è dover ricordare se la sessione esiste già:
tmux new fallisce se c'è, tmux attach fallisce se non
c'è. L'opzione -A unisce le due cose — «attaccati, e se non esiste
creala».
$ tmux new -A -s main # nel .bashrc o .zshrc, con un alias corto: alias t='tmux new -A -s main' # o per sessione con il nome della cartella corrente: alias tt='tmux new -A -s "$(basename "$PWD")"'
Da quel momento t è idempotente: la prima volta crea, tutte le altre
riattacca. Non devi più chiederti in che stato hai lasciato la macchina.
Attaccarsi da soli all'ingresso su un server
Sulle macchine remote conviene fare un passo in più: entrare in tmux automaticamente a ogni SSH, così non capita mai di lanciare per sbaglio un processo lungo fuori da una sessione.
# solo se: siamo in ssh, siamo interattivi, e non siamo già dentro tmux
if [ -n "$SSH_CONNECTION" ] && [ -z "$TMUX" ] && [[ $- == *i* ]]; then
tmux new -A -s main
fi$TMUX vuoto
finiresti con tmux dentro tmux ogni volta che apri un pannello; senza il controllo
di interattività romperesti scp, rsync e ogni comando
SSH non interattivo, che si aspettano una shell muta dall'altra parte. Se ti serve
entrare senza tmux una volta sola: ssh -t server bash --noprofile.