Se hai mai usato bash per qualcosa di più complicato di un semplice script di backup, conosci bene la sensazione. Vuoi elencare i processi in esecuzione, filtrare quelli che consumano più di 500 MB di RAM, ordinarli per utilizzo della CPU e stampare solo il PID e il nome del programma. In teoria, un’operazione banale. In pratica, finisci con una catena di comandi che include ps, awk, grep, sort e cut, separati da pipe, dove ogni passaggio deve decifrare l’output testuale del precedente, con spazi, tab e colonne che cambiano dimensione a seconda della piattaforma o della versione del comando.
Il problema non è che bash sia uno strumento poco potente, bensì il fatto che, come tutte le shell Unix tradizionali, essa tratti ogni output come un flusso di testo grezzo. I dati strutturati vengono serializzati in stringhe, poi devi “de-serializzarli” manualmente con awk o sed per estrarne i pezzi che ti interessano. Questo approccio ha retto per decenni, ma mostra i suoi limiti non appena lavori con JSON, CSV, file di configurazione o output di API.
Nushell nasce proprio per risolvere questo problema: non è una bash più bella o una zsh con più plugin, ma una shell con una filosofia fondamentalmente diversa, in cui ogni comando produce dati strutturati (tabelle, record, liste) e la pipeline non concatena testo ma oggetti tipizzati. Il risultato è un ambiente in cui filtrare, ordinare, trasformare e ispezionare i dati diventa qualcosa di intuitivo, senza dover ricordare la sintassi di awk o contare le colonne a occhio. Aggiornata ad aprile 2026 con la versione 0.112.2, Nushell è disponibile su Linux, macOS e Windows, ed è scritta in Rust.
Dati come tabelle, non come stringhe
Il concetto centrale di Nushell è semplice da capire con un esempio pratico. In bash, quando esegui ls, ottieni un output testuale, ovvero una colonna di nomi di file, eventualmente con permessi, dimensioni e date se usi ls -l. Quell’output è testo. Se vuoi filtrarlo, devi parsare il testo.
In Nushell, ls restituisce invece una tabella strutturata:
╭───┬─────────────────────┬──────┬─────────┬────────────────╮
│ # │ name │ type │ size │ modified │
├───┼─────────────────────┼──────┼─────────┼────────────────┤
│ 0 │ README.md │ file │ 3.2 KB │ 2 days ago │
│ 1 │ src │ dir │ 4.1 KB │ 3 hours ago │
│ 2 │ Cargo.toml │ file │ 1.8 KB │ a week ago │
╰───┴─────────────────────┴──────┴─────────┴────────────────╯Ogni riga è un record con colonne tipizzate. Vuoi solo le directory? Non ti serve grep. Scrivi:
ls | where type == "dir"Vuoi ordinare i file per dimensione in ordine decrescente e vedere solo quelli sopra 1 MB?
ls | where size > 1MB | sort-by size --reverseLo stesso principio si applica a qualsiasi comando. ps restituisce una tabella di processi con colonne pid, name, cpu, mem. Il comando sys restituisce informazioni sul sistema operativo come un record navigabile. Persino l’output di comandi esterni che producono JSON viene automaticamente parsato e convertito in struttura dati nativa, senza bisogno di jq.
Questa è la differenza sostanziale rispetto a PowerShell, che segue un approccio simile ma è storicamente legata all’ecosistema Windows (anche se ora è cross-platform). Nushell abbraccia la filosofia Unix delle pipeline ma sostituisce il testo grezzo con dati strutturati, mantenendo la stessa compattezza ed eleganza della riga di comando.
Come installarla e configurarla in cinque minuti
Nushell è disponibile attraverso praticamente tutti i principali package manager. La strada più rapida dipende dal sistema operativo in uso.
Su macOS con Homebrew:
brew install nushellSu Linux con le distro apt-based (come Ubuntu e Debian):
sudo apt install nushellIn alternativa, se preferisci avere sempre l’ultima versione, puoi usare cargo (richiede Rust installato):
cargo install nuSu Windows tramite Winget o scoop:
winget install nushell.nushellscoop install nuUna volta installato, lancia semplicemente nu dal tuo terminale corrente per entrare nella shell interattiva. Non devi impostarlo come shell di default per cominciare a usarlo: puoi esplorarlo dall’interno di bash o zsh, e decidere in un secondo momento se vuoi migrare completamente.
Nota: se installi nu su Windows, significa imparare i suoi comandi, che per convenzione seguono la nomenclatura Unix (ls, rm, cp, mv ecc.) anziché quella Windows. Quindi per listare una directory dovrai usare ls e non dir. Con un doppio Tab puoi ricevere la lista di comandi completi.
Se vuoi impostarlo come shell di default su Linux o macOS, verifica prima che sia nella lista delle shell valide:
which nu # scopri il path, di solito /usr/bin/nu o /usr/local/bin/nu
cat /etc/shellsSe il path di nu non è nell’elenco, aggiungilo con questi due comandi:
echo $(which nu) | sudo tee -a /etc/shells
chsh -s $(which nu)Il file di configurazione principale si trova in ~/.config/nushell/config.nu. Nushell lo genera automaticamente al primo avvio con valori predefiniti sensati, tra cui prompt colorato, autocompletamento funzionante e syntax highlighting inline. Non è necessario configurare nulla per avere un’esperienza subito piacevole.
Nushell: la pipeline come linguaggio di trasformazione dati
Quello che rende Nushell davvero interessante non è solo il fatto che ls restituisce una tabella, ma che ogni comando della pipeline è consapevole del tipo dei dati che riceve. Questo cambia completamente il modo in cui puoi comporre i comandi.
Supponiamo di voler analizzare un file JSON che contiene una lista di record:
open dati.json | where age > 30 | sort-by name | select name email | to csvQuesto singolo comando apre il file JSON, filtra i record con età superiore a 30 anni, li ordina per nome, seleziona solo le colonne name e email, e converte il risultato in CSV. Nessun jq, nessun awk, nessun python -c "import json...".
Lo stesso approccio funziona con CSV, YAML, TOML, Excel e SQLite. Nushell include comandi nativi per aprire, manipolare e convertire tra questi formati, senza dipendenze esterne.
Per chi lavora con API o strumenti moderni che espongono interfacce JSON, la combinazione con http get è particolarmente comoda:
http get https://api.example.com/users | where active == true | get nameUn altro comando da tenere a mente è explore. Prende qualsiasi dato strutturato e lo presenta in un’interfaccia interattiva navigabile da tastiera, particolarmente utile quando devi ispezionare JSON annidati in profondità senza perderti tra le parentesi graffe.
Il sistema di tipi di Nushell è abbastanza rigoroso: dimensioni in byte come 1MB o 500KB, durate (2hr, 30min), date e URL vengono tutti riconosciuti e gestiti in modo nativo. Questo ti evita di convertire manualmente le unità e riduce notevolmente la quantità di errori silenziosi tipici degli script bash dove tutto è una stringa.
Script e automazioni: via di mezzo tra bash e Python
Uno degli usi più pratici di Nushell è la scrittura di script. Il linguaggio di scripting di Nu ha una sintassi pulita, supporta funzioni, variabili con scope, gestione degli errori esplicita e tipi. Ecco un esempio pratico: uno script che trova i file modificati negli ultimi 7 giorni, più grandi di 100 KB, e genera un report CSV.
#!/usr/bin/env nu
def trova-file-recenti [cartella: string, giorni: int, dimensione_min: filesize] {
ls $cartella
| where type == "file"
| where modified > ((date now) - ($giorni * 1day))
| where size > $dimensione_min
| sort-by modified --reverse
| select name size modified
}
trova-file-recenti "/home/user/documenti" 7 100KB | to csv | save report.csv
Rispetto a bash, questo script è immediatamente leggibile anche da chi non lo ha scritto. I tipi sono espliciti, le operazioni sulle date sono in chiaro, e il risultato è CSV senza bisogno di librerie esterne.
Rispetto a Python, è molto più conciso per questo tipo di operazioni su file e dati. Non hai bisogno di importare os, csv, datetime, perché tutto è già integrato nella shell.
La curva di apprendimento esiste, soprattutto se sei abituato al paradigma bash. Alcune cose funzionano diversamente: le variabili sono immutabili per default, non ci sono subshell nel senso tradizionale, e alcuni comandi Unix classici si comportano in modo leggermente diverso.
Tuttavia, Nushell mantiene la compatibilità con i comandi esterni del sistema operativo. Puoi ancora chiamare git, docker, python, ffmpeg e qualsiasi altro eseguibile, e i loro output testuali vengono accettati normalmente nella pipeline.
Plugin e integrazione con l’ecosistema esistente
Nushell ha un sistema di plugin che ti permette di estendere le sue capacità senza modificare il core. I plugin sono eseguibili separati che comunicano con la shell tramite un protocollo JSON-RPC, il che significa che possono essere scritti in qualsiasi linguaggio, tra cui Rust, Python, Go e JavaScript.
Tra i plugin più rilevanti c’è nu_plugin_polars, che integra la libreria Polars (la stessa usata da molti ingegneri in Python) direttamente nella shell. Con questo plugin puoi caricare dataset grandi in memoria in modo efficiente, eseguire aggregazioni, join tra tabelle e operazioni statistiche con la stessa sintassi pipeline di Nu.
polars open dati.csv | polars filter-with (polars col "valore" | polars gt 100) | polars collect
C’è poi nu_plugin_formats, che aggiunge supporto per formati aggiuntivi come Eml e ICS. E nu_plugin_gstat, che integra statistiche Git direttamente nei comandi di shell.
Per installare un plugin una volta scaricato o compilato, bastano due comandi:
plugin add ~/.cargo/bin/nu_plugin_polars
plugin use polars
L’integrazione con strumenti come Starship (prompt personalizzabile), Zoxide (navigazione intelligente tra cartelle) e Atuin (cronologia shell cifrata e sincronizzata) funziona senza problemi. Se hai già configurato questi strumenti su zsh o bash, la migrazione è per lo più una questione di aggiungere le righe di inizializzazione corrette nel file config.nu.
Nushell: esperienza piacevole fin dai primi minuti
Nushell è un progetto ancora in sviluppo attivo. La versione corrente è la 0.112.2, e il team non ha ancora dichiarato una 1.0 stabile. Questo significa che tra una release e l’altra possono esserci cambi importanti (breaking change), ovvero comandi rinominati, comportamenti leggermente modificati, opzioni spostate.
Chi lavora in ambienti di produzione dove la stabilità è critica farà bene a considerare questo aspetto prima di adottarlo come shell principale in script automatizzati.
Detto questo, per uso quotidiano e interattivo, Nushell è già abbondantemente maturo. L’autocompletamento è preciso e contestuale, i messaggi di errore sono chiari e indicano esattamente dove si trova il problema.
Chi trarrà più beneficio da Nushell è chi lavora regolarmente con dati strutturati dalla riga di comando: sviluppatori che interrogano API, chi gestisce pipeline di dati, chi analizza log di sistema, chi lavora con file di configurazione in vari formati. Per tutte queste categorie, eliminare il parsing testuale e lavorare direttamente con strutture tipizzate è un cambio netto di efficienza.













