Una shell moderna che tratta tutto come dati strutturati invece di testo grezzo. Le pipeline funzionano con tabelle, record e liste — non solo stringhe. Pensala come una shell che comprende nativamente JSON, CSV, TOML e YAML.
| Piattaforma | Comando |
|---|
| macOS (Homebrew) | brew install nushell |
| Windows (Winget) | winget install nushell |
| Windows (Chocolatey) | choco install nushell |
| Windows (Scoop) | scoop install nu |
| Ubuntu/Debian | sudo apt install nushell (o scarica dalle release GitHub) |
| Arch Linux | sudo pacman -S nushell |
| Fedora/RHEL | sudo dnf install nushell |
| Cargo (Tutte le piattaforme) | cargo install nu |
| Nix | nix-env -iA nixpkgs.nushell |
Avvio: Esegui nu da qualsiasi shell per avviare Nushell. Imposta come shell predefinita: chsh -s $(which nu)
Le pipeline Nushell passano dati strutturati (tabelle, record, liste), non testo:
# Shell tradizionale: testo → grep → awk → testo
# Nushell: tabella → where → select → tabella
ls | where size > 1mb | sort-by size --reverse | first 5
Tipi di dati: stringhe, interi, float, booleani, date, durate, dimensioni file, liste, record, tabelle
| Comando | Descrizione |
|---|
ls | Elenca directory come tabella strutturata |
ls -la | Elenca tutti i file (inclusi nascosti) in formato lungo |
cd path/to/dir | Cambia directory |
cp source dest | Copia file o directory |
mv source dest | Sposta o rinomina file |
rm file | Rimuovi file |
mkdir dirname | Crea directory |
open file.json | Apri file come dati strutturati (rileva automaticamente il formato) |
open file.csv | Apri CSV come tabella |
open file.toml | Apri TOML come record |
save output.json | Salva output pipeline su file |
cat file.txt | Visualizza contenuti file come testo |
ps | Mostra processi in esecuzione come tabella |
sys | Mostra informazioni di sistema |
which command | Trova posizione comando |
help commands | Elenca tutti i comandi disponibili |
help <command> | Mostra aiuto per un comando specifico |
| Comando | Descrizione |
|---|
ls | where size > 10mb | Filtra file più grandi di 10 MB |
ls | where name =~ "\.rs$" | Filtra per regex sul nome file |
ls | where type == "dir" | Mostra solo le directory |
ls | where modified > 2day | File modificati negli ultimi 2 giorni |
ls | select name size | Mostra solo colonne nome e dimensione |
ls | reject type | Rimuovi la colonna tipo |
ls | get name | Estrai solo la colonna nome come lista |
ls | first 5 | Mostra prime 5 voci |
ls | last 3 | Mostra ultime 3 voci |
ls | skip 10 | Salta le prime 10 voci |
ls | nth 0 2 4 | Seleziona voci per indice |
ls | length | Conta numero di voci |
ls | uniq | Rimuovi voci duplicate |
| Comando | Descrizione |
|---|
ls | sort-by size | Ordina per dimensione crescente |
ls | sort-by size --reverse | Ordina per dimensione decrescente |
ls | sort-by name | Ordina alfabeticamente |
ls | group-by type | Raggruppa voci per tipo |
ls | group-by {get name | path parse | get extension} | Raggruppa per estensione file |
| Comando | Descrizione |
|---|
"hello world" | str upcase | Converti in maiuscolo |
"HELLO" | str downcase | Converti in minuscolo |
" hello " | str trim | Rimuovi spazi bianchi |
"hello" | str contains "ell" | Controlla se stringa contiene sottostringa |
"hello" | str replace "l" "L" | Sostituisci caratteri |
"hello world" | split row " " | Dividi stringa in lista |
["hello" "world"] | str join ", " | Unisci lista in stringa |
"hello" | str length | Ottieni lunghezza stringa |
"hello" | str starts-with "he" | Controlla prefisso stringa |
| Comando | Descrizione |
|---|
open data.json | get field_name | Accedi a un campo in JSON |
open data.json | get nested.field | Accedi a campi annidati |
{name: "Alice", age: 30} | Crea un record |
[1 2 3 4 5] | Crea una lista |
[[name age]; [Alice 30] [Bob 25]] | Crea una tabella |
$data | to json | Converti in JSON |
$data | to csv | Converti in CSV |
$data | to toml | Converti in TOML |
$data | to yaml | Converti in YAML |
$data | to md | Converti in tabella Markdown |
| Comando | Descrizione |
|---|
[1 2 3 4] | math sum | Somma dei valori |
[1 2 3 4] | math avg | Media dei valori |
[1 2 3 4] | math max | Valore massimo |
[1 2 3 4] | math min | Valore minimo |
[1 2 3 4] | math median | Valore mediano |
ls | get size | math sum | Dimensione totale dei file elencati |
1 + 2 | Aritmetica di base |
10 / 3 | Divisione |
2 ** 8 | Esponenziazione |
| Comando | Descrizione |
|---|
http get https://api.example.com/data | Recupera URL e analizza risposta |
http post https://api.example.com/data {key: "value"} | Richiesta POST con corpo |
fetch url | get field | Recupera ed estrai campo specifico |
# Variabili (immutabili per default)
let name = "Alice"
let count = 42
let files = (ls | where size > 1mb)
# Variabili mutabili
mut counter = 0
$counter += 1
# If/else
if $count > 10 { "big" } else { "small" }
# Cicli
for file in (ls) { print $file.name }
ls | each { |row| $row.name | str upcase }
# Comandi personalizzati (funzioni)
def greet [name: string] { $"Hello, ($name)!" }
greet "World"
| File | Scopo |
|---|
$nu.config-path | Configurazione principale (config.nu) |
$nu.env-path | Configurazione ambiente (env.nu) |
# Mostra posizione file di configurazione
$nu.config-path
# Modifica configurazione
config nu # Apri config.nu nell'editor
config env # Apri env.nu nell'editor
# In config.nu
$env.config = {
show_banner: false # Disabilita banner di benvenuto
table: {
mode: rounded # Stile tabella: rounded, compact, thin, none
}
completions: {
algorithm: "fuzzy" # Completamento tab fuzzy
}
history: {
max_size: 10000 # Voci cronologia da mantenere
file_format: "sqlite" # sqlite o plaintext
}
}
# Trova i file più grandi in un progetto
ls **/* | where type == "file" | sort-by size --reverse | first 20
# Analizza e interroga API JSON
http get https://api.github.com/repos/nushell/nushell | select stargazers_count forks_count
# Converti tra formati
open data.csv | to json | save data.json
# Analizza file di log
open access.log | lines | parse "{ip} - - [{date}] \"{method} {path} {proto}\" {status} {size}"
| where status == "404" | group-by path | sort-by -r
# Panoramica rapida del sistema
sys | get host
ps | sort-by cpu --reverse | first 10
| Funzionalità | Bash/Zsh | Nushell |
|---|
| Modello dati | Flussi di testo | Tabelle strutturate |
| Analisi output | grep, awk, sed | where, select, get integrati |
| Gestione JSON | Richiede jq | Nativo (open file.json) |
| Gestione errori | Codici di uscita | Messaggi di errore ricchi |
| Completamento tab | Base | Context-aware |
| Sistema di tipi | Nessuno | Interi, stringhe, date, dimensioni, ecc. |
| Curva di apprendimento | Familiare | Nuova sintassi da imparare |
| Comandi esterni | Nativi | Completamente supportati |