$ tmux — corso in 10 lezioni
Lezione 01 di 10

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ì.

Teoria

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.

LivelloChe cos'è
serverun processo solo, avviato da solo al primo comando. Contiene tutto il resto. Non lo vedi quasi mai.
sessioneuno spazio di lavoro con un nome. È la cosa che sopravvive: ti ci attacchi e ti ci stacchi.
finestrauna schermata intera dentro la sessione, come una scheda del browser. Numerata da 0.
pannelloun riquadro dentro una finestra. Ogni pannello ha la sua shell.
come stanno insieme
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.

sito 0:editor 1:server* 2:log 14:32 12-set

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.

Pratica

Entrare, staccarsi, tornare

installazione
$ 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.

ComandoEffetto
tmuxavvia il server e crea una sessione senza nome (0, 1, 2…)
tmux new -s sitocrea una sessione chiamata «sito» — fallo sempre, i nomi servono
tmux lselenca le sessioni esistenti
tmux attach -t sitosi riattacca a quella sessione · in breve tmux a -t sito
tmux kill-session -t sitola chiude per davvero
exitchiude 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.

una giornata tipo
$ 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
Senza tmux, quello script sarebbe morto. Quando cade la connessione SSH, la shell remota riceve un segnale di chiusura e lo passa a tutto ciò che ha lanciato. È il problema che 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.
Trucco

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».

il comando che uso ogni giorno
$ 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.

in fondo al .bashrc del server
# 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
Le tre condizioni servono tutte. Senza $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.