Zum Inhalt springen

Nushell

Moderne strukturierte Daten-Shell, die Befehlsausgaben als Tabellen behandelt und Pipelines mit typisierten Daten, Filterung und plattformübergreifendem Scripting unterstützt.

BefehlBeschreibung
brew install nushellInstallation auf macOS mit Homebrew
cargo install nuInstallation von crates.io
winget install nushellInstallation auf Windows mit winget
sudo apt install nushellInstallation auf Debian/Ubuntu
pacman -S nushellInstallation auf Arch Linux
nix-env -i nushellInstallation auf NixOS
nuNushell starten
nu --versionInstallierte Version anzeigen
nu -c "ls"Einzelnen Befehl ausführen und beenden
nu script.nuNushell-Skriptdatei ausführen
chsh -s /usr/bin/nuNushell als Standard-Shell festlegen
BefehlBeschreibung
sysVollständige Systeminformationen anzeigen
sys hostHost-Details anzeigen (Name, OS, Kernel)
sys memSpeicherverbrauch anzeigen
sys cpuCPU-Informationen anzeigen
sys disksFestplattennutzung anzeigen
sys netNetzwerkschnittstellen anzeigen
sys tempTemperatursensoren anzeigen
date nowAktuelles Datum und Uhrzeit anzeigen
date now | format date "%Y-%m-%d"Aktuelles Datum formatieren
$nu.home-pathHome-Verzeichnispfad anzeigen
$nu.os-infoOS-Details anzeigen
BefehlBeschreibung
lsDateien als strukturierte Tabelle auflisten
ls -lAusführliche Auflistung mit Details
ls -aVersteckte Dateien anzeigen
ls **/*.rsRekursiver Glob für Rust-Dateien
ls | where size > 1mbDateien größer als 1MB filtern
ls | where type == dirNur Verzeichnisse filtern
ls | sort-by modified -rNach Änderungsdatum sortieren (neueste zuerst)
ls | sort-by size -rNach Größe absteigend sortieren
ls | get nameNur Dateinamen-Spalte abrufen
BefehlBeschreibung
psProzesse als Tabelle auflisten
ps | where cpu > 10Prozesse mit >10% CPU finden
ps | where name =~ "node"Prozesse nach Namensmuster finden
ps | sort-by mem -r | first 10Top 10 Prozesse nach Speicher
ps | where pid == 1234Prozess nach PID finden
BefehlBeschreibung
helpAllgemeine Hilfe anzeigen
help commandsAlle verfügbaren Befehle auflisten
help lsHilfe für bestimmten Befehl anzeigen
help operatorsVerfügbare Operatoren auflisten
help escapesString-Escape-Sequenzen anzeigen
BefehlBeschreibung
ls | select name sizeBestimmte Spalten auswählen
ls | reject modifiedBestimmte Spalten entfernen
ls | rename filename filesizeSpalten umbenennen
ls | first 5Erste 5 Zeilen abrufen
ls | last 3Letzte 3 Zeilen abrufen
ls | skip 10Erste 10 Zeilen überspringen
ls | lengthAnzahl der Zeilen zählen
ls | reverseZeilenreihenfolge umkehren
ls | shuffleZeilenreihenfolge zufällig mischen
ls | flattenVerschachtelte Tabellen abflachen
ls | columnsSpaltennamen auflisten
BefehlBeschreibung
ls | where size > 1mbNach Vergleich filtern
ls | where name =~ "test"Nach Regex-Übereinstimmung filtern
ls | where name starts-with "src"Nach Präfix filtern
ls | where name ends-with ".md"Nach Suffix filtern
ls | where type in ["file" "dir"]Nach Werteliste filtern
ls | sort-by size -rAbsteigend sortieren
ls | sort-by name -iGroß-/Kleinschreibung ignorierend sortieren
ls | uniq-by typeDuplikate nach Spalte entfernen
ls | group-by typeZeilen nach Spaltenwert gruppieren
BefehlBeschreibung
ls | each { |it| $it.name }Jede Zeile transformieren
ls | par-each { |it| $it.name }Parallel transformieren
ls | update size { |it| $it.size / 1kb }Spaltenwerte aktualisieren
ls | insert label { |it| $it.name + "-file" }Neue Spalte hinzufügen
ls | reduce -f 0 { |it, acc| $acc + $it.size }Werte akkumulieren
ls | enumerateIndex-Spalte hinzufügen
ls | window 3Gleitendes Fenster von 3 Zeilen
ls | zip [1 2 3]Mit einer anderen Liste verbinden
ls | transposeZeilen und Spalten tauschen
BefehlBeschreibung
42Integer
3.14Float
"hello"String
true / falseBoolean
nullNull-Wert
2024-01-15Datum
5sec / 3min / 2hrZeitdauer
1kb / 5mb / 2gbDateigröße
0b1010Binärliteral
0xffHexadezimalliteral
BefehlBeschreibung
[1 2 3]Liste
[1 2 3] | append 4An Liste anhängen
[1 2 3] | prepend 0Vor Liste einfügen
{name: "Alice", age: 30}Record
{a: 1} | merge {b: 2}Records zusammenführen
[[name age]; ["Alice" 30] ["Bob" 25]]Tabellenliteral
0..9Bereich (0 bis 9)
0..<9Exklusiver Bereich (0 bis 8)
0..2..10Bereich mit Schrittweite (0, 2, 4, 6, 8, 10)
BefehlBeschreibung
"42" | into intString zu Integer
"3.14" | into floatString zu Float
42 | into stringZahl zu String
"true" | into boolString zu Boolean
"2024-01-15" | into datetimeString zu Datetime
1024 | into filesizeZahl zu Dateigröße
5 | into duration --unit secZahl zu Zeitdauer
42 | into binaryZahl zu Binär
[1 2 3] | into recordListe zu Record
{a: 1} | into recordIn Record konvertieren
BefehlBeschreibung
open data.jsonJSON-Datei öffnen und parsen
open data.csvCSV-Datei öffnen und parsen
open data.yamlYAML-Datei öffnen und parsen
open data.tomlTOML-Datei öffnen und parsen
open data.xmlXML-Datei öffnen und parsen
open data.tsvTSV-Datei öffnen und parsen
open data.sqliteSQLite-Datenbank öffnen
open file.txtAls Klartext öffnen
open data.json | get usersÖffnen und in Daten navigieren
BefehlBeschreibung
"hello" | save hello.txtString in Datei speichern
ls | save files.jsonTabelle als JSON speichern
ls | save files.csvTabelle als CSV speichern
ls | save files.yamlTabelle als YAML speichern
open data.json | to csvJSON in CSV konvertieren
open data.csv | to jsonCSV in JSON konvertieren
open data.json | save data.yamlZwischen Formaten konvertieren
open data.csv | save -f data.csvBestehende Datei überschreiben
"line1\nline2" | save -a log.txtAn Datei anhängen
BefehlBeschreibung
open file.txt | linesDatei in Zeilen aufteilen
open file.txt | lines | lengthZeilen in Datei zählen
open file.csv | where status == "active"CSV-Zeilen filtern
open file.json | select name emailFelder aus JSON auswählen
open file.json | to yaml | save file.yamlJSON in YAML konvertieren
glob "**/*.md" | each { |f| open $f }Alle passenden Dateien öffnen
BefehlBeschreibung
"hello world" | str upcaseIn Großbuchstaben konvertieren
"HELLO" | str downcaseIn Kleinbuchstaben konvertieren
"hello" | str capitalizeErsten Buchstaben großschreiben
" hello " | str trimLeerzeichen entfernen
"hello" | str trim --char "h"Bestimmtes Zeichen entfernen
"hello" | str reverseString umkehren
BefehlBeschreibung
"hello world" | str replace "world" "nu"Erstes Vorkommen ersetzen
"aabaa" | str replace -a "a" "x"Alle Vorkommen ersetzen
"hello world" | str replace -r '\w+' 'word'Mit Regex ersetzen
"hello world" | str contains "world"Prüfen ob String enthält
"hello world" | str starts-with "hello"Präfix prüfen
"hello world" | str ends-with "world"Suffix prüfen
"hello world" | str index-of "world"Position des Teilstrings finden
BefehlBeschreibung
"hello world" | split row " "Nach Trennzeichen aufteilen
"a,b,c" | split row ","CSV-artigen String aufteilen
"hello" | split charsIn Zeichen aufteilen
["hello" "world"] | str join " "Liste zu String verbinden
["a" "b" "c"] | str join ","Mit Komma verbinden
"hello" | str lengthString-Länge ermitteln
"hello world" | str substring 0..5Teilstring extrahieren
# Grundlegende Interpolation
let name = "World"
$"Hello, ($name)!"

# Ausdrucks-Interpolation
$"Total: (1 + 2 + 3)"

# Mehrzeilige Strings
$"Line 1
Line 2
Line 3"

# Rohe Strings (keine Escape-Zeichen)
r#'C:\Users\path'#
BefehlBeschreibung
def greet [name: string] { $"Hello, ($name)!" }Grundlegender benutzerdefinierter Befehl
def add [a: int, b: int] -> int { $a + $b }Befehl mit Typannotationen
def greet [name = "World"] { ... }Befehl mit Standardparameter
def "git branches" [] { git branch | lines }Unterbefehl-artiger Name
def --wrapped cmd [...rest] { ... }Beliebige zusätzliche Argumente akzeptieren
BefehlBeschreibung
let x = 42Unveränderliche Variable
mut x = 0; $x = $x + 1Veränderliche Variable
const PI = 3.14159Kompilierzeit-Konstante
if $x > 0 { "pos" } else { "neg" }Bedingter Ausdruck
match $x { 1 => "one", 2 => "two", _ => "other" }Pattern Matching
for item in [1 2 3] { print $item }For-Schleife
while $x < 10 { $x = $x + 1 }While-Schleife
loop { if $x > 10 { break }; $x += 1 }Endlosschleife mit break
try { risky_op } catch { "failed" }Fehlerbehandlung
# Funktion mit Flag-Parameter
def greet [
  name: string       # Name zum Begrüßen
  --excited (-e)     # Ausrufezeichen verwenden
] {
  if $excited {
    $"Hello, ($name)!"
  } else {
    $"Hello, ($name)."
  }
}

# Funktion mit Rest-Parametern
def sum [...nums: int] -> int {
  $nums | math sum
}

# Pipeline-Eingabefunktion
def double-all [] {
  each { |x| $x * 2 }
}
# Verwendung: [1 2 3] | double-all
BefehlBeschreibung
[1 2 3 4 5] | math sumSumme der Werte
[1 2 3 4 5] | math avgDurchschnitt der Werte
[1 2 3 4 5] | math minMinimalwert
[1 2 3 4 5] | math maxMaximalwert
[1 2 3 4 5] | math medianMedianwert
[1 2 3 4 5] | math stddevStandardabweichung
[1 2 3 4 5] | math varianceVarianz
[1 2 3] | math productProdukt der Werte
10 | math absAbsolutwert
10 | math sqrtQuadratwurzel
2 | math round -p 2Auf Genauigkeit runden
10 | math log 2Logarithmus Basis 2
BefehlBeschreibung
http get https://api.example.com/dataGET-Anfrage
http post https://api.example.com/data {name: "test"}POST-Anfrage mit JSON
http put https://api.example.com/data/1 {name: "updated"}PUT-Anfrage
http delete https://api.example.com/data/1DELETE-Anfrage
http get url --headers [Accept application/json]GET mit benutzerdefinierten Headern
http get url | get dataGET und Feld extrahieren
port 8080Prüfen ob Port belegt ist
# JSON-API abrufen und verarbeiten
let users = (http get "https://jsonplaceholder.typicode.com/users")
$users | select name email | first 5

# POST mit Headern und Body
http post "https://api.example.com/items" {
  name: "New Item"
  price: 29.99
} --headers [Authorization $"Bearer ($env.API_TOKEN)"]
BefehlBeschreibung
$nu.config-pathKonfigurationsdateipfad anzeigen
$nu.env-pathUmgebungs-Konfigurationsdateipfad anzeigen
$nu.default-config-dirKonfigurationsverzeichnis anzeigen
config nuKonfiguration im Editor öffnen
config envUmgebungs-Konfiguration im Editor öffnen
BefehlBeschreibung
$env.config.show_banner = falseStartbanner deaktivieren
$env.config.buffer_editor = "vim"Editor für Ctrl+O festlegen
$env.config.history.file_format = "sqlite"SQLite-Verlauf verwenden
$env.config.history.max_size = 100_000Maximale Verlaufseinträge festlegen
$env.config.completions.external.enable = trueExterne Vervollständigungen aktivieren
$env.config.cursor_shape.emacs = "line"Cursorform festlegen
$env.config.footer_mode = "25"Fußzeile für große Tabellen anzeigen
$env.config.table.mode = "rounded"Tabellenrandstil festlegen
BefehlBeschreibung
$env.PATH = ($env.PATH | prepend "/usr/local/bin")Zu PATH hinzufügen
$env.PATH = ($env.PATH | append "~/.local/bin")An PATH anhängen
$env.EDITOR = "vim"Umgebungsvariable festlegen
alias ll = ls -lBefehlsalias erstellen
source ~/.config/nushell/custom.nuZusätzliche Konfiguration einbinden
# env.nu — Umgebungskonfiguration
$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 — Shell-Konfiguration
$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
    }
  }
}
BefehlBeschreibung
module greet { export def hello [] { "hi" } }Modul inline definieren
use greet helloBefehl aus Modul importieren
use greet *Alles aus Modul importieren
use utils.nuAus Dateimodul importieren
overlay use spamOverlay aktivieren
overlay hide spamOverlay deaktivieren
overlay listAktive Overlays auflisten
# Datei: 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 " "
}

# Verwendung:
# use utils.nu
# "Hello World" | str kebab    # "hello-world"
# "hello world" | str title    # "Hello World"
BefehlBeschreibung
open data.dbSQLite-Datenbank öffnen
open data.db | query db "SELECT * FROM users"SQL-Abfrage ausführen
open data.db | query db "SELECT * FROM users WHERE age > 30"Gefilterte Abfrage
open data.db | schemaDatenbankschema anzeigen
[[name age]; ["Alice" 30]] | into sqlite data.dbSQLite aus Tabelle erstellen
ls | into sqlite -t files data.dbTabelle in SQLite speichern
BefehlBeschreibung
plugin listInstallierte Plugins auflisten
plugin add /path/to/pluginPlugin registrieren
plugin rm plugin_namePlugin entfernen
plugin use plugin_namePlugin laden
cargo install nu_plugin_formatsFormate-Plugin installieren
cargo install nu_plugin_queryQuery-Plugin installieren
cargo install nu_plugin_gstatGit-Status-Plugin installieren
  1. Strukturierte Daten verwenden — Nushell glänzt, wenn man mit Tabellen und Records statt mit rohen Strings arbeitet. Befehle durch select, where und sort-by statt grep und awk pipen.

  2. Funktionsparameter typisieren — Typannotationen zu benutzerdefinierten Befehlen hinzufügen (name: string, count: int), um Fehler früh zu erkennen und bessere Autovervollständigung zu ermöglichen.

  3. Unveränderliche Variablen bevorzugen — Standardmäßig let verwenden und mut nur bei echtem Bedarf für Mutation einsetzen. Dies verhindert versehentliche Zustandsänderungen in Skripten.

  4. SQLite-Verlauf verwenden$env.config.history.file_format = "sqlite" setzen für schnellere Suchen, bessere Korruptionsresistenz und reichhaltigere Metadaten.

  5. par-each für Performance nutzen — Bei der Verarbeitung vieler unabhängiger Elemente läuft par-each in parallelen Threads und kann deutlich schneller als each sein.

  6. Module für wiederverwendbaren Code verwenden — Benutzerdefinierte Befehle in .nu-Moduldateien organisieren und mit use statt source importieren. Module haben ordnungsgemäßes Namespacing und Exports.

  7. into für Typkonvertierungen verwenden — Immer explizite Typkonvertierung (into int, into string, etc.) statt impliziter Umwandlung für zuverlässige Skripte nutzen.

  8. Vervollständigungen konfigurieren — Externe Vervollständigungen und Carapace für Shell-Completion-Unterstützung über alle CLI-Tools aktivieren.

  9. String-Interpolation verwenden$"Hello, ($name)!" statt String-Verkettung mit + für saubereren, besser lesbaren Code bevorzugen.

  10. Fehler mit try/catch behandeln — Operationen, die fehlschlagen können (Dateizugriff, HTTP, Parsing), in try { } catch { } Blöcke einschließen für robuste Skripte.

  11. Mit describe testenexpression | describe verwenden, um den Typ eines beliebigen Werts während der Entwicklung und beim Debugging zu untersuchen.

  12. Closures konsistent verwenden — Nushell-Closures verwenden die { |params| body } Syntax. Immer die Pipe-Zeichen einschließen, auch bei einzelnen Parametern, für Klarheit.