Salta ai contenuti

Nushell

Shell moderna a dati strutturati che tratta l’output dei comandi come tabelle e supporta pipeline con dati tipizzati, filtraggio e scripting multipiattaforma.

ComandoDescrizione
brew install nushellInstalla su macOS con Homebrew
cargo install nuInstalla da crates.io
winget install nushellInstalla su Windows con winget
sudo apt install nushellInstalla su Debian/Ubuntu
pacman -S nushellInstalla su Arch Linux
nix-env -i nushellInstalla su NixOS
nuAvvia Nushell
nu --versionMostra la versione installata
nu -c "ls"Esegue un singolo comando ed esce
nu script.nuEsegue un file script Nushell
chsh -s /usr/bin/nuImposta Nushell come shell predefinita
ComandoDescrizione
sysMostra informazioni complete del sistema
sys hostMostra dettagli dell’host (nome, OS, kernel)
sys memMostra utilizzo della memoria
sys cpuMostra informazioni sulla CPU
sys disksMostra utilizzo dei dischi
sys netMostra interfacce di rete
sys tempMostra sensori di temperatura
date nowMostra data e ora corrente
date now | format date "%Y-%m-%d"Formatta la data corrente
$nu.home-pathMostra il percorso della directory home
$nu.os-infoMostra dettagli del sistema operativo
ComandoDescrizione
lsElenca i file come tabella strutturata
ls -lElenco dettagliato con informazioni
ls -aMostra file nascosti
ls **/*.rsGlob ricorsivo per file Rust
ls | where size > 1mbFiltra file superiori a 1MB
ls | where type == dirFiltra solo le directory
ls | sort-by modified -rOrdina per data di modifica (piu recenti prima)
ls | sort-by size -rOrdina per dimensione decrescente
ls | get nameOttieni solo la colonna dei nomi
ComandoDescrizione
psElenca i processi come tabella
ps | where cpu > 10Trova processi che usano >10% CPU
ps | where name =~ "node"Trova processi per pattern del nome
ps | sort-by mem -r | first 10Top 10 processi per memoria
ps | where pid == 1234Trova processo per PID
ComandoDescrizione
helpMostra l’aiuto generale
help commandsElenca tutti i comandi disponibili
help lsMostra l’aiuto per un comando specifico
help operatorsElenca gli operatori disponibili
help escapesMostra le sequenze di escape delle stringhe
ComandoDescrizione
ls | select name sizeSeleziona colonne specifiche
ls | reject modifiedRimuovi colonne specifiche
ls | rename filename filesizeRinomina colonne
ls | first 5Ottieni le prime 5 righe
ls | last 3Ottieni le ultime 3 righe
ls | skip 10Salta le prime 10 righe
ls | lengthConta il numero di righe
ls | reverseInverti l’ordine delle righe
ls | shuffleRandomizza l’ordine delle righe
ls | flattenAppiattisci tabelle annidate
ls | columnsElenca i nomi delle colonne
ComandoDescrizione
ls | where size > 1mbFiltra 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 -rOrdina decrescente
ls | sort-by name -iOrdina senza distinzione maiuscole/minuscole
ls | uniq-by typeRimuovi duplicati per colonna
ls | group-by typeRaggruppa righe per valore della colonna
ComandoDescrizione
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 | enumerateAggiungi colonna indice
ls | window 3Finestra scorrevole di 3 righe
ls | zip [1 2 3]Unisci con un’altra lista
ls | transposeScambia righe e colonne
ComandoDescrizione
42Intero
3.14Decimale
"hello"Stringa
true / falseBooleano
nullValore nullo
2024-01-15Data
5sec / 3min / 2hrDurata
1kb / 5mb / 2gbDimensione file
0b1010Letterale binario
0xffLetterale esadecimale
ComandoDescrizione
[1 2 3]Lista
[1 2 3] | append 4Aggiungi alla lista
[1 2 3] | prepend 0Anteponi alla lista
{name: "Alice", age: 30}Record
{a: 1} | merge {b: 2}Unisci record
[[name age]; ["Alice" 30] ["Bob" 25]]Letterale tabella
0..9Intervallo (da 0 a 9)
0..<9Intervallo esclusivo (da 0 a 8)
0..2..10Intervallo con passo (0, 2, 4, 6, 8, 10)
ComandoDescrizione
"42" | into intStringa a intero
"3.14" | into floatStringa a decimale
42 | into stringNumero a stringa
"true" | into boolStringa a booleano
"2024-01-15" | into datetimeStringa a datetime
1024 | into filesizeNumero a dimensione file
5 | into duration --unit secNumero a durata
42 | into binaryNumero a binario
[1 2 3] | into recordLista a record
{a: 1} | into recordConverti a record
ComandoDescrizione
open data.jsonApri e analizza file JSON
open data.csvApri e analizza file CSV
open data.yamlApri e analizza file YAML
open data.tomlApri e analizza file TOML
open data.xmlApri e analizza file XML
open data.tsvApri e analizza file TSV
open data.sqliteApri database SQLite
open file.txtApri come testo semplice
open data.json | get usersApri e naviga nei dati
ComandoDescrizione
"hello" | save hello.txtSalva stringa su file
ls | save files.jsonSalva tabella come JSON
ls | save files.csvSalva tabella come CSV
ls | save files.yamlSalva tabella come YAML
open data.json | to csvConverti JSON in CSV
open data.csv | to jsonConverti CSV in JSON
open data.json | save data.yamlConverti tra formati
open data.csv | save -f data.csvForza sovrascrittura file esistente
"line1\nline2" | save -a log.txtAggiungi al file
ComandoDescrizione
open file.txt | linesDividi file in righe
open file.txt | lines | lengthConta le righe nel file
open file.csv | where status == "active"Filtra righe CSV
open file.json | select name emailSeleziona campi dal JSON
open file.json | to yaml | save file.yamlConverti JSON in YAML
glob "**/*.md" | each { |f| open $f }Apri tutti i file corrispondenti
ComandoDescrizione
"hello world" | str upcaseConverti in maiuscolo
"HELLO" | str downcaseConverti in minuscolo
"hello" | str capitalizePrima lettera maiuscola
" hello " | str trimRimuovi spazi bianchi
"hello" | str trim --char "h"Rimuovi carattere specifico
"hello" | str reverseInverti stringa
ComandoDescrizione
"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
ComandoDescrizione
"hello world" | split row " "Dividi per delimitatore
"a,b,c" | split row ","Dividi stringa stile CSV
"hello" | split charsDividi in caratteri
["hello" "world"] | str join " "Unisci lista in stringa
["a" "b" "c"] | str join ","Unisci con virgola
"hello" | str lengthOttieni lunghezza stringa
"hello world" | str substring 0..5Estrai 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'#
ComandoDescrizione
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
ComandoDescrizione
let x = 42Variabile immutabile
mut x = 0; $x = $x + 1Variabile mutabile
const PI = 3.14159Costante 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
ComandoDescrizione
[1 2 3 4 5] | math sumSomma dei valori
[1 2 3 4 5] | math avgMedia dei valori
[1 2 3 4 5] | math minValore minimo
[1 2 3 4 5] | math maxValore massimo
[1 2 3 4 5] | math medianValore mediano
[1 2 3 4 5] | math stddevDeviazione standard
[1 2 3 4 5] | math varianceVarianza
[1 2 3] | math productProdotto dei valori
10 | math absValore assoluto
10 | math sqrtRadice quadrata
2 | math round -p 2Arrotonda alla precisione
10 | math log 2Logaritmo in base 2
ComandoDescrizione
http get https://api.example.com/dataRichiesta 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/1Richiesta DELETE
http get url --headers [Accept application/json]GET con header personalizzati
http get url | get dataGET ed estrai campo
port 8080Controlla 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)"]
ComandoDescrizione
$nu.config-pathMostra il percorso del file di configurazione
$nu.env-pathMostra il percorso del file di configurazione env
$nu.default-config-dirMostra la directory di configurazione
config nuApri la configurazione nell’editor
config envApri la configurazione env nell’editor
ComandoDescrizione
$env.config.show_banner = falseDisabilita 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_000Imposta il massimo di voci nella cronologia
$env.config.completions.external.enable = trueAbilita 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
ComandoDescrizione
$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 -lCrea alias per un comando
source ~/.config/nushell/custom.nuCarica 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
    }
  }
}
ComandoDescrizione
module greet { export def hello [] { "hi" } }Definisci un modulo inline
use greet helloImporta comando dal modulo
use greet *Importa tutto dal modulo
use utils.nuImporta da file modulo
overlay use spamAttiva overlay
overlay hide spamDisattiva overlay
overlay listElenca 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"
ComandoDescrizione
open data.dbApri 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 | schemaMostra schema del database
[[name age]; ["Alice" 30]] | into sqlite data.dbCrea SQLite da tabella
ls | into sqlite -t files data.dbSalva tabella in SQLite
ComandoDescrizione
plugin listElenca plugin installati
plugin add /path/to/pluginRegistra un plugin
plugin rm plugin_nameRimuovi un plugin
plugin use plugin_nameCarica un plugin
cargo install nu_plugin_formatsInstalla plugin formati
cargo install nu_plugin_queryInstalla plugin query
cargo install nu_plugin_gstatInstalla plugin git status
  1. 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.

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

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

  4. Usa la cronologia SQLite — Imposta $env.config.history.file_format = "sqlite" per ricerche piu veloci, migliore resistenza alla corruzione e metadati piu ricchi.

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

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

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

  8. Configura i completamenti — Abilita i completamenti esterni e carapace per il supporto al completamento della shell su tutti gli strumenti CLI.

  9. Usa l’interpolazione di stringhe — Preferisci $"Hello, ($name)!" alla concatenazione di stringhe con + per un codice piu pulito e leggibile.

  10. Gestisci gli errori con try/catch — Racchiudi le operazioni che potrebbero fallire (accesso ai file, HTTP, parsing) in blocchi try { } catch { } per script robusti.

  11. Testa con describe — Usa expression | describe per ispezionare il tipo di qualsiasi valore durante lo sviluppo e il debug.

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