← mondinlab.com

codenotes

appunti tecnici, aggiornati man mano

La libreria di comandi che uso lavorando su questo sito: shell, Git, server, Python. Cerca quello che ti serve e copialo.

/
0 voci  ·  / per cercare, esc per pulire

Nessuna voce trovata. Prova con meno parole.

Shell / Unix

Navigare, spostare file, cercare, gestire i processi. Uguale su macOS (Terminale) e sul server Linux, salvo dove segnalato.

Navigazione tra cartelle

pwd                    # percorso corrente
ls                     # elenca i file
ls -l                  # elenco dettagliato
ls -la                 # include anche i file nascosti
ls -lah                # + dimensioni leggibili (KB, MB)
cd nome                # entra (percorso relativo, dentro la cartella corrente)
cd /percorso/assoluto  # percorso assoluto: parte da / e funziona da ovunque
cd ..                  # cartella superiore
cd ~                   # home (server da root: /root · ~ su Mac: ⌥ Option + 5)
cd -                   # torna all'ultima cartella visitata

Assoluto vs relativo: il percorso assoluto inizia con / e funziona da qualsiasi posizione; quello relativo (senza /) parte dalla cartella corrente.

Creare e gestire file e cartelle

mkdir nome                # crea una cartella
mkdir -p a/b/c            # crea l'intera catena di cartelle
touch file               # crea un file vuoto
cp origine destinazione  # copia un file
cp -rp cartella/ backup/ # copia una cartella (-r) con date e permessi (-p)
mv origine destinazione  # sposta o rinomina

Eliminare file e cartelle

rm file                # elimina un file
rm -r cartella         # elimina una cartella e il suo contenuto
rm -rf cartella        # come sopra, senza chiedere conferma

Attenzione: rm non ha cestino e non è reversibile. Con -rf non c'è nessuna conferma: controlla due volte il percorso. Mai rm -rf /rm -rf $VAR/ se la variabile potrebbe essere vuota.

Backup datato prima di modificare un file

cp -p file.txt file-backup-$(date +%Y%m%d).txt
ls -la file-backup-*

$(date +%Y%m%d) inserisce la data di oggi (es. 20260829), così il nome dice sempre quando è stato fatto il backup. Il secondo comando elenca tutti i backup accumulati.

Vedere il contenuto di un file

cat file               # mostra tutto il contenuto
less file              # sfoglia i file lunghi (q per uscire)
head file              # prime 10 righe
tail file              # ultime 10 righe
tail -f file           # segue il file in tempo reale (utile per i log)

Cercare file e testo

find . -name "*.html"                # cerca file per nome, dalla cartella corrente
grep "testo" file                    # cerca del testo dentro un file
grep -rn "testo" cartella            # ricorsivo (-r), col numero di riga (-n)

Cercare in tutto il server:

find / -iname "*.html" -not -path "/proc/*" 2>/dev/null

-iname cerca per nome ignorando le maiuscole, -not -path esclude le cartelle di sistema rumorose, 2>/dev/null nasconde gli errori di "permesso negato".

Permessi e amministratore

chmod +x script.sh         # rende un file eseguibile
chmod 644 file             # lettura per tutti, scrittura solo al proprietario
chown utente:gruppo file   # cambia il proprietario di un file
sudo comando               # esegue un comando come amministratore (sul server)

Pipe e redirezione

comando > file            # scrive l'output in un file (lo sovrascrive)
comando >> file           # aggiunge in fondo al file
comando 2>/dev/null       # butta via i messaggi di errore
comando1 | comando2       # passa l'output del primo al secondo
ls -la | grep ".html"     # esempio: elenca i file e tiene solo i .html

Archivi compressi

tar -czf sito.tar.gz cartella/    # crea un archivio .tar.gz
tar -xzf sito.tar.gz              # lo estrae
zip -r sito.zip cartella/         # crea un .zip
unzip sito.zip                    # lo estrae

Processi e risorse

top                    # processi attivi (q per uscire)
ps aux                 # elenco completo dei processi
kill PID               # termina un processo dato il suo numero (PID)
df -h                  # spazio libero su disco
free -h                # memoria RAM disponibile (Linux)
du -sh *               # dimensione di ogni cartella qui dentro
whoami                 # utente corrente

Fermare un comando in esecuzione

Ctrl+C

Ferma un programma che resta attivo occupando il terminale (streamlit run, un server, tail -f). Il terminale torna al prompt.

Eseguire uno script

python3 file.py                # esegue uno script Python
python3 /percorso/completo/file.py
chmod +x script.sh             # rende eseguibile uno script
./script.sh                    # lo esegue dalla cartella corrente

Editor da terminale

nano file              # editor semplice: Ctrl+O salva, Ctrl+X esce

Utilità e scorciatoie

clear                  # pulisce lo schermo
history                # cronologia dei comandi
which comando          # dove si trova un comando
open .                 # apre la cartella corrente nel Finder (solo macOS)
open file              # apre un file con l'app predefinita (solo macOS)

Git

Tenere traccia delle modifiche al codice e tornare indietro quando serve. I comandi si lanciano dentro la cartella del progetto.

Preparare un progetto

git init                       # trasforma la cartella corrente in un repository
git clone URL                  # scarica un repository esistente
git config --global user.name "Nome Cognome"
git config --global user.email "[email protected]"

Vedere lo stato

git status                     # cosa è cambiato, cosa è pronto per il commit
git status -s                  # versione compatta
git diff                       # differenze non ancora aggiunte
git diff --staged              # differenze già aggiunte con git add

Salvare le modifiche (commit)

git add file.html              # aggiunge un file al prossimo commit
git add .                      # aggiunge tutte le modifiche
git add -p                     # sceglie pezzo per pezzo (y / n / s / q)
git commit -m "Messaggio chiaro"
git commit --amend             # corregge l'ultimo commit (solo se non hai fatto push)

Un messaggio utile dice cosa cambia e perché, non "modifiche varie".

Cronologia

git log --oneline --graph --all -20
git show HASH                  # dettaglio di un commit

Rami (branch)

git switch -c bozza            # crea un ramo nuovo e ci si sposta
git switch main               # torna al ramo principale
git branch                    # elenca i rami
git merge bozza               # fonde "bozza" nel ramo corrente

Sincronizzare con GitHub

git remote -v                 # repository remoti collegati
git push                      # invia i commit locali
git pull                      # scarica e integra le modifiche remote
git fetch                     # scarica senza integrare

Mettere da parte le modifiche (stash)

git stash                     # nasconde le modifiche non committate
git stash pop                 # le rimette
git stash list

Utile per cambiare ramo al volo senza committare a metà.

Annullare le modifiche a un file

git restore file.html            # riporta il file all'ultimo commit
git restore --staged file.html   # toglie dall'add, tiene le modifiche

Attenzione: senza --staged le modifiche non committate vanno perse.

Riportare tutto all'ultimo commit

git reset --hard                 # scarta OGNI modifica non committata
git reset --hard HEAD~1          # elimina anche l'ultimo commit

Attenzione: non c'è recupero. Se hai dei dubbi, prima git stash.

Ho fatto un casino: torno alla versione su GitHub

git fetch origin
git reset --hard origin/main

Attenzione: butta via tutte le modifiche locali non inviate. Per salvarne una parte, prima git stash oppure git switch -c salvataggio.

SSH e server

Lavorare sul server remoto via SSH: collegarsi, spostare file, gestire i servizi e i container.

Collegarsi

ssh root@IP-DEL-SERVER
ssh [email protected]
ssh-keygen -t ed25519          # crea una chiave SSH (una volta sola)
ssh-copy-id utente@server      # installa la chiave sul server

Copiare file da e verso il server

scp file.html root@server:/var/www/sito/html/
scp root@server:/var/log/nginx/error.log .
rsync -avz --dry-run ./html/ root@server:/var/www/sito/html/
rsync -avz --delete  ./html/ root@server:/var/www/sito/html/

rsync trasferisce solo le differenze. Prova sempre prima con --dry-run; --delete cancella sul server i file spariti in locale.

Gestire i servizi

systemctl status nginx
systemctl restart nginx
systemctl reload nginx         # ricarica la config senza interrompere le connessioni
journalctl -u nginx -n 50 --no-pager
journalctl -u nginx -f         # log in tempo reale

Ricaricare nginx in sicurezza

nginx -t && systemctl reload nginx

nginx -t controlla la configurazione; il && ricarica solo se il test passa.

Docker

docker ps                      # container attivi in questo momento
docker compose up -d           # avvia i servizi in background
docker compose down            # ferma e rimuove
docker compose logs -f nome    # segue i log di un servizio
docker compose exec nome sh    # apre una shell dentro il container

Python — strumenti

Ambienti isolati, librerie, avvio e controllo degli script. La sintassi del linguaggio sta nella pagina basi.

Ambiente virtuale (venv)

python3 -m venv venv           # crea un ambiente virtuale nella cartella "venv"
source venv/bin/activate       # attiva (il prompt mostra "(venv)")
deactivate                     # disattiva

Il venv tiene separate le librerie di ogni progetto, evitando conflitti.

Installare librerie (pip)

pip install nomelibreria             # installa una libreria
pip install libreria1 libreria2      # più librerie insieme
pip install -r requirements.txt      # tutte quelle elencate in un file
pip list                             # librerie installate nel venv attivo
pip freeze > requirements.txt        # salva l'elenco esatto delle versioni

Importante: attiva sempre il venv (source venv/bin/activate) prima di installare, altrimenti le librerie finiscono nel sistema globale.

Verificare se una libreria è installata

pip show nomelibreria

Mostra versione e dettagli se è installata nel venv attivo. Se dice Package(s) not found, va installata con pip install.

Eseguire uno script

python nomefile.py             # con il venv attivo
python3 nomefile.py            # esplicito su Python 3

Controllare la sintassi senza eseguire

python -m py_compile nomefile.py

Controlla parentesi, indentazione e due punti senza eseguire davvero il file. Nessun output = tutto corretto. Utile prima di lanciare script lunghi o dopo modifiche importanti.

Avviare una dashboard Streamlit

streamlit run nomefile.py --server.port 8501 --server.address 0.0.0.0

--server.port è la porta (default 8501); --server.address 0.0.0.0 la rende raggiungibile da fuori il server, non solo da dentro. Poi si apre dal browser su http://IP-DEL-SERVER:8501. Ctrl+C per fermarla.