Shell moderna a dati strutturati che tratta l’output dei comandi come tabelle e supporta pipeline con dati tipizzati, filtraggio e scripting multipiattaforma.
| Comando | Descrizione |
|---|
brew install nushell | Installa su macOS con Homebrew |
cargo install nu | Installa da crates.io |
winget install nushell | Installa su Windows con winget |
sudo apt install nushell | Installa su Debian/Ubuntu |
pacman -S nushell | Installa su Arch Linux |
nix-env -i nushell | Installa su NixOS |
nu | Avvia Nushell |
nu --version | Mostra la versione installata |
nu -c "ls" | Esegue un singolo comando ed esce |
nu script.nu | Esegue un file script Nushell |
chsh -s /usr/bin/nu | Imposta Nushell come shell predefinita |
| Comando | Descrizione |
|---|
sys | Mostra informazioni complete del sistema |
sys host | Mostra dettagli dell’host (nome, OS, kernel) |
sys mem | Mostra utilizzo della memoria |
sys cpu | Mostra informazioni sulla CPU |
sys disks | Mostra utilizzo dei dischi |
sys net | Mostra interfacce di rete |
sys temp | Mostra sensori di temperatura |
date now | Mostra data e ora corrente |
date now | format date "%Y-%m-%d" | Formatta la data corrente |
$nu.home-path | Mostra il percorso della directory home |
$nu.os-info | Mostra dettagli del sistema operativo |
| Comando | Descrizione |
|---|
ls | Elenca i file come tabella strutturata |
ls -l | Elenco dettagliato con informazioni |
ls -a | Mostra file nascosti |
ls **/*.rs | Glob ricorsivo per file Rust |
ls | where size > 1mb | Filtra file superiori a 1MB |
ls | where type == dir | Filtra solo le directory |
ls | sort-by modified -r | Ordina per data di modifica (piu recenti prima) |
ls | sort-by size -r | Ordina per dimensione decrescente |
ls | get name | Ottieni solo la colonna dei nomi |
| Comando | Descrizione |
|---|
ps | Elenca i processi come tabella |
ps | where cpu > 10 | Trova processi che usano >10% CPU |
ps | where name =~ "node" | Trova processi per pattern del nome |
ps | sort-by mem -r | first 10 | Top 10 processi per memoria |
ps | where pid == 1234 | Trova processo per PID |
| Comando | Descrizione |
|---|
help | Mostra l’aiuto generale |
help commands | Elenca tutti i comandi disponibili |
help ls | Mostra l’aiuto per un comando specifico |
help operators | Elenca gli operatori disponibili |
help escapes | Mostra le sequenze di escape delle stringhe |
| Comando | Descrizione |
|---|
ls | select name size | Seleziona colonne specifiche |
ls | reject modified | Rimuovi colonne specifiche |
ls | rename filename filesize | Rinomina colonne |
ls | first 5 | Ottieni le prime 5 righe |
ls | last 3 | Ottieni le ultime 3 righe |
ls | skip 10 | Salta le prime 10 righe |
ls | length | Conta il numero di righe |
ls | reverse | Inverti l’ordine delle righe |
ls | shuffle | Randomizza l’ordine delle righe |
ls | flatten | Appiattisci tabelle annidate |
ls | columns | Elenca i nomi delle colonne |
| Comando | Descrizione |
|---|
ls | where size > 1mb | Filtra per confronto |
ls | where name =~ "test" | Filtra per corrispondenza regex |
ls | where name starts-with "src" | Filtra per prefisso |
ls | where name ends-with ".md" | Filtra per suffisso |
ls | where type in ["file" "dir"] | Filtra per lista di valori |
ls | sort-by size -r | Ordina decrescente |
ls | sort-by name -i | Ordina senza distinzione maiuscole/minuscole |
ls | uniq-by type | Rimuovi duplicati per colonna |
ls | group-by type | Raggruppa righe per valore della colonna |
| Comando | Descrizione |
|---|
ls | each { |it| $it.name } | Trasforma ogni riga |
ls | par-each { |it| $it.name } | Trasforma in parallelo |
ls | update size { |it| $it.size / 1kb } | Aggiorna i valori della colonna |
ls | insert label { |it| $it.name + "-file" } | Aggiungi nuova colonna |
ls | reduce -f 0 { |it, acc| $acc + $it.size } | Accumula valori |
ls | enumerate | Aggiungi colonna indice |
ls | window 3 | Finestra scorrevole di 3 righe |
ls | zip [1 2 3] | Unisci con un’altra lista |
ls | transpose | Scambia righe e colonne |
| Comando | Descrizione |
|---|
42 | Intero |
3.14 | Decimale |
"hello" | Stringa |
true / false | Booleano |
null | Valore nullo |
2024-01-15 | Data |
5sec / 3min / 2hr | Durata |
1kb / 5mb / 2gb | Dimensione file |
0b1010 | Letterale binario |
0xff | Letterale esadecimale |
| Comando | Descrizione |
|---|
[1 2 3] | Lista |
[1 2 3] | append 4 | Aggiungi alla lista |
[1 2 3] | prepend 0 | Anteponi alla lista |
{name: "Alice", age: 30} | Record |
{a: 1} | merge {b: 2} | Unisci record |
[[name age]; ["Alice" 30] ["Bob" 25]] | Letterale tabella |
0..9 | Intervallo (da 0 a 9) |
0..<9 | Intervallo esclusivo (da 0 a 8) |
0..2..10 | Intervallo con passo (0, 2, 4, 6, 8, 10) |
| Comando | Descrizione |
|---|
"42" | into int | Stringa a intero |
"3.14" | into float | Stringa a decimale |
42 | into string | Numero a stringa |
"true" | into bool | Stringa a booleano |
"2024-01-15" | into datetime | Stringa a datetime |
1024 | into filesize | Numero a dimensione file |
5 | into duration --unit sec | Numero a durata |
42 | into binary | Numero a binario |
[1 2 3] | into record | Lista a record |
{a: 1} | into record | Converti a record |
| Comando | Descrizione |
|---|
open data.json | Apri e analizza file JSON |
open data.csv | Apri e analizza file CSV |
open data.yaml | Apri e analizza file YAML |
open data.toml | Apri e analizza file TOML |
open data.xml | Apri e analizza file XML |
open data.tsv | Apri e analizza file TSV |
open data.sqlite | Apri database SQLite |
open file.txt | Apri come testo semplice |
open data.json | get users | Apri e naviga nei dati |
| Comando | Descrizione |
|---|
"hello" | save hello.txt | Salva stringa su file |
ls | save files.json | Salva tabella come JSON |
ls | save files.csv | Salva tabella come CSV |
ls | save files.yaml | Salva tabella come YAML |
open data.json | to csv | Converti JSON in CSV |
open data.csv | to json | Converti CSV in JSON |
open data.json | save data.yaml | Converti tra formati |
open data.csv | save -f data.csv | Forza sovrascrittura file esistente |
"line1\nline2" | save -a log.txt | Aggiungi al file |
| Comando | Descrizione |
|---|
open file.txt | lines | Dividi file in righe |
open file.txt | lines | length | Conta le righe nel file |
open file.csv | where status == "active" | Filtra righe CSV |
open file.json | select name email | Seleziona campi dal JSON |
open file.json | to yaml | save file.yaml | Converti JSON in YAML |
glob "**/*.md" | each { |f| open $f } | Apri tutti i file corrispondenti |
| Comando | Descrizione |
|---|
"hello world" | str upcase | Converti in maiuscolo |
"HELLO" | str downcase | Converti in minuscolo |
"hello" | str capitalize | Prima lettera maiuscola |
" hello " | str trim | Rimuovi spazi bianchi |
"hello" | str trim --char "h" | Rimuovi carattere specifico |
"hello" | str reverse | Inverti stringa |
| Comando | Descrizione |
|---|
"hello world" | str replace "world" "nu" | Sostituisci prima occorrenza |
"aabaa" | str replace -a "a" "x" | Sostituisci tutte le occorrenze |
"hello world" | str replace -r '\w+' 'word' | Sostituisci con regex |
"hello world" | str contains "world" | Controlla se la stringa contiene |
"hello world" | str starts-with "hello" | Controlla prefisso |
"hello world" | str ends-with "world" | Controlla suffisso |
"hello world" | str index-of "world" | Trova posizione della sottostringa |
| Comando | Descrizione |
|---|
"hello world" | split row " " | Dividi per delimitatore |
"a,b,c" | split row "," | Dividi stringa stile CSV |
"hello" | split chars | Dividi in caratteri |
["hello" "world"] | str join " " | Unisci lista in stringa |
["a" "b" "c"] | str join "," | Unisci con virgola |
"hello" | str length | Ottieni lunghezza stringa |
"hello world" | str substring 0..5 | Estrai sottostringa |
# Interpolazione base
let name = "World"
$"Hello, ($name)!"
# Interpolazione con espressioni
$"Total: (1 + 2 + 3)"
# Stringhe multi-riga
$"Line 1
Line 2
Line 3"
# Stringhe raw (senza escape)
r#'C:\Users\path'#
| Comando | Descrizione |
|---|
def greet [name: string] { $"Hello, ($name)!" } | Comando personalizzato base |
def add [a: int, b: int] -> int { $a + $b } | Comando con annotazioni di tipo |
def greet [name = "World"] { ... } | Comando con parametro predefinito |
def "git branches" [] { git branch | lines } | Nome stile sottocomando |
def --wrapped cmd [...rest] { ... } | Accetta argomenti extra |
| Comando | Descrizione |
|---|
let x = 42 | Variabile immutabile |
mut x = 0; $x = $x + 1 | Variabile mutabile |
const PI = 3.14159 | Costante a tempo di compilazione |
if $x > 0 { "pos" } else { "neg" } | Espressione condizionale |
match $x { 1 => "one", 2 => "two", _ => "other" } | Pattern matching |
for item in [1 2 3] { print $item } | Ciclo for |
while $x < 10 { $x = $x + 1 } | Ciclo while |
loop { if $x > 10 { break }; $x += 1 } | Ciclo infinito con break |
try { risky_op } catch { "failed" } | Gestione errori |
# Funzione con parametro flag
def greet [
name: string # Nome da salutare
--excited (-e) # Usa punto esclamativo
] {
if $excited {
$"Hello, ($name)!"
} else {
$"Hello, ($name)."
}
}
# Funzione con parametri rest
def sum [...nums: int] -> int {
$nums | math sum
}
# Funzione con input da pipeline
def double-all [] {
each { |x| $x * 2 }
}
# Utilizzo: [1 2 3] | double-all
| Comando | Descrizione |
|---|
[1 2 3 4 5] | math sum | Somma dei valori |
[1 2 3 4 5] | math avg | Media dei valori |
[1 2 3 4 5] | math min | Valore minimo |
[1 2 3 4 5] | math max | Valore massimo |
[1 2 3 4 5] | math median | Valore mediano |
[1 2 3 4 5] | math stddev | Deviazione standard |
[1 2 3 4 5] | math variance | Varianza |
[1 2 3] | math product | Prodotto dei valori |
10 | math abs | Valore assoluto |
10 | math sqrt | Radice quadrata |
2 | math round -p 2 | Arrotonda alla precisione |
10 | math log 2 | Logaritmo in base 2 |
| Comando | Descrizione |
|---|
http get https://api.example.com/data | Richiesta GET |
http post https://api.example.com/data {name: "test"} | Richiesta POST con JSON |
http put https://api.example.com/data/1 {name: "updated"} | Richiesta PUT |
http delete https://api.example.com/data/1 | Richiesta DELETE |
http get url --headers [Accept application/json] | GET con header personalizzati |
http get url | get data | GET ed estrai campo |
port 8080 | Controlla se la porta e in uso |
# Recupera e processa API JSON
let users = (http get "https://jsonplaceholder.typicode.com/users")
$users | select name email | first 5
# POST con header e corpo
http post "https://api.example.com/items" {
name: "New Item"
price: 29.99
} --headers [Authorization $"Bearer ($env.API_TOKEN)"]
| Comando | Descrizione |
|---|
$nu.config-path | Mostra il percorso del file di configurazione |
$nu.env-path | Mostra il percorso del file di configurazione env |
$nu.default-config-dir | Mostra la directory di configurazione |
config nu | Apri la configurazione nell’editor |
config env | Apri la configurazione env nell’editor |
| Comando | Descrizione |
|---|
$env.config.show_banner = false | Disabilita il banner di avvio |
$env.config.buffer_editor = "vim" | Imposta l’editor per Ctrl+O |
$env.config.history.file_format = "sqlite" | Usa cronologia SQLite |
$env.config.history.max_size = 100_000 | Imposta il massimo di voci nella cronologia |
$env.config.completions.external.enable = true | Abilita completamenti esterni |
$env.config.cursor_shape.emacs = "line" | Imposta la forma del cursore |
$env.config.footer_mode = "25" | Mostra footer per tabelle grandi |
$env.config.table.mode = "rounded" | Imposta lo stile dei bordi della tabella |
| Comando | Descrizione |
|---|
$env.PATH = ($env.PATH | prepend "/usr/local/bin") | Aggiungi al PATH |
$env.PATH = ($env.PATH | append "~/.local/bin") | Accoda al PATH |
$env.EDITOR = "vim" | Imposta variabile d’ambiente |
alias ll = ls -l | Crea alias per un comando |
source ~/.config/nushell/custom.nu | Carica configurazione aggiuntiva |
# env.nu — configurazione dell'ambiente
$env.PATH = ($env.PATH | split row (char esep)
| prepend "/usr/local/bin"
| prepend ($env.HOME | path join ".cargo" "bin")
| append ($env.HOME | path join "go" "bin")
)
$env.EDITOR = "nvim"
$env.VISUAL = "nvim"
$env.PAGER = "less"
# config.nu — configurazione della shell
$env.config = {
show_banner: false
buffer_editor: "nvim"
table: {
mode: rounded
index_mode: auto
trim: {
methodology: wrapping
wrapping_try_keep_words: true
}
}
history: {
file_format: "sqlite"
max_size: 100_000
sync_on_enter: true
isolation: false
}
completions: {
case_sensitive: false
quick: true
partial: true
algorithm: "prefix"
external: {
enable: true
max_results: 100
}
}
}
| Comando | Descrizione |
|---|
module greet { export def hello [] { "hi" } } | Definisci un modulo inline |
use greet hello | Importa comando dal modulo |
use greet * | Importa tutto dal modulo |
use utils.nu | Importa da file modulo |
overlay use spam | Attiva overlay |
overlay hide spam | Disattiva overlay |
overlay list | Elenca overlay attivi |
# file: utils.nu
export def "str kebab" [] {
$in | str downcase | str replace -a " " "-"
}
export def "str title" [] {
$in | split row " "
| each { |w| $w | str capitalize }
| str join " "
}
# Utilizzo:
# use utils.nu
# "Hello World" | str kebab # "hello-world"
# "hello world" | str title # "Hello World"
| Comando | Descrizione |
|---|
open data.db | Apri database SQLite |
open data.db | query db "SELECT * FROM users" | Esegui query SQL |
open data.db | query db "SELECT * FROM users WHERE age > 30" | Query filtrata |
open data.db | schema | Mostra schema del database |
[[name age]; ["Alice" 30]] | into sqlite data.db | Crea SQLite da tabella |
ls | into sqlite -t files data.db | Salva tabella in SQLite |
| Comando | Descrizione |
|---|
plugin list | Elenca plugin installati |
plugin add /path/to/plugin | Registra un plugin |
plugin rm plugin_name | Rimuovi un plugin |
plugin use plugin_name | Carica un plugin |
cargo install nu_plugin_formats | Installa plugin formati |
cargo install nu_plugin_query | Installa plugin query |
cargo install nu_plugin_gstat | Installa plugin git status |
-
Usa dati strutturati — Nushell eccelle quando lavori con tabelle e record invece di stringhe grezze. Usa i comandi attraverso select, where e sort-by invece di grep e awk.
-
Specifica i tipi dei parametri delle funzioni — Aggiungi annotazioni di tipo ai comandi personalizzati (name: string, count: int) per individuare errori in anticipo e abilitare un autocompletamento migliore.
-
Preferisci variabili immutabili — Usa let come impostazione predefinita e usa mut solo quando hai veramente bisogno di mutazione. Questo previene cambiamenti di stato accidentali negli script.
-
Usa la cronologia SQLite — Imposta $env.config.history.file_format = "sqlite" per ricerche piu veloci, migliore resistenza alla corruzione e metadati piu ricchi.
-
Sfrutta par-each per le prestazioni — Quando elabori molti elementi indipendentemente, par-each esegue in thread paralleli e puo essere significativamente piu veloce di each.
-
Usa moduli per codice riutilizzabile — Organizza i comandi personalizzati in file modulo .nu e usa use invece di source. I moduli hanno un corretto namespacing ed export.
-
Usa into per le conversioni di tipo — Usa sempre conversioni di tipo esplicite (into int, into string, ecc.) invece di affidarti alla coercizione implicita per script affidabili.
-
Configura i completamenti — Abilita i completamenti esterni e carapace per il supporto al completamento della shell su tutti gli strumenti CLI.
-
Usa l’interpolazione di stringhe — Preferisci $"Hello, ($name)!" alla concatenazione di stringhe con + per un codice piu pulito e leggibile.
-
Gestisci gli errori con try/catch — Racchiudi le operazioni che potrebbero fallire (accesso ai file, HTTP, parsing) in blocchi try { } catch { } per script robusti.
-
Testa con describe — Usa expression | describe per ispezionare il tipo di qualsiasi valore durante lo sviluppo e il debug.
-
Usa le closure in modo consistente — Le closure di Nushell usano la sintassi { |params| body }. Includi sempre i caratteri pipe anche per singoli parametri per maggiore chiarezza.