Nushell je zajímavou alternativou k asi nejrozšířenější variantě shellu Bash. Nepatří do top pětky, ten kromě Bashe okupují Tcsh/Csh, Ksh, Zsh a Fish.
Dle autorů je Nushell nový typ shellu a už v úvodu dokumentace se dozvíte hlavní rozdíl. Programy v tradičních shellech spolu komunikují pomocí textových řetězců. Program zapíše text na standardní výstup a druhý program tento text přečte a zpracuje ze standardního vstupu.
To mohlo stačit v dobách kdy byly tyto shelly vytvořeny, ale doba se posunula. Dnes je v mnoha aplikacích defacto standard JSON. Například Bash v základu práci s JSON formátem nepodporuje a je potřeba použít nějaký JSON processor. Například jq.
Nushell tuto filozofii neboří, naopak rozšiřuje a umožňuje posílat i jiné datové typy.
Integers -65535
Floats (decimals) 9.9999, Infinity
Strings "hole 18", 'hole 18', hole 18, hole18, r#'hole18'#
Booleans true
Dates 2000-01-01
Durations 2min + 12sec
File-sizes 64mb
Ranges 0..4, 0..<5, 0.., ..4
Binary 0x[FE FF]
Lists [0 1 'two' 3]
Records {name:"Nushell", lang: "Rust"}
Tables [{x:12, y:15}, {x:8, y:9}], [[x, y]; [12, 15], [8, 9]]
Closures {|e| $e + 1 | into string }, { $in.name.0 | path exists }
Cell-paths $.name.0
Blocks if true { print "hello!" }, loop { print "press ctrl-c to exit" }
Null (Nothing) null
Any let p: any = 5
Jednou z výhod tohoto přístupu je, že výstupem může být tabulka, kterou další programy mohou zpracovat. Pokud chcete v Bashi například seřadit a filtrovat výstup příkazu ls, tak to bude kombinace příkazů ls, sort, grep, cut a možná i dalších. Největší obtíž bude kontext. Výstupy mezi program budou jen textové řetězce bez kontextu. Ale zkušený Linux admin to určitě zvládne s přehledem.
V Nushelu další program ví, že je to tabulka, která má nějaké sloupce co se nějak jmenují a hodnoty ve sloupcích mají nějaký typ. Tím výsledná sekvence příkazů vypadá mnohem přirozeněji a intuitivněji.
Příklad 1: Proces co zabírá nejvíc paměti
~/bin> ps
╭───┬──────┬──────┬──────┬──────────┬──────┬──────────┬──────────╮
│ # │ pid │ ppid │ name │ status │ cpu │ mem │ virtual │
├───┼──────┼──────┼──────┼──────────┼──────┼──────────┼──────────┤
│ 0 │ 1 │ 0 │ init │ Sleeping │ 0.00 │ 339.9 kB │ 997.3 GB │
│ 1 │ 1724 │ 1 │ init │ Sleeping │ 0.00 │ 249.8 kB │ 997.3 GB │
│ 2 │ 1725 │ 1724 │ bash │ Sleeping │ 0.00 │ 3.5 MB │ 222.2 GB │
│ 3 │ 1762 │ 1725 │ sudo │ Sleeping │ 0.00 │ 2.5 MB │ 309.2 GB │
│ 4 │ 1763 │ 1762 │ nu │ Running │ 0.00 │ 18.4 MB │ 150.1 GB │
╰───┴──────┴──────┴──────┴──────────┴──────┴──────────┴──────────╯
Výstupem je tabulka, co má sloupce. V našem případě nás zajímá sloupec mem. Ten má jako řádky hodnoty typu file-size podle kterých lze sortovat.
~/bin> ps | sort-by mem
╭───┬──────┬──────┬──────┬──────────┬──────┬──────────┬──────────╮
│ # │ pid │ ppid │ name │ status │ cpu │ mem │ virtual │
├───┼──────┼──────┼──────┼──────────┼──────┼──────────┼──────────┤
│ 0 │ 1724 │ 1 │ init │ Sleeping │ 0.00 │ 249.8 kB │ 997.3 GB │
│ 1 │ 1 │ 0 │ init │ Sleeping │ 0.00 │ 339.9 kB │ 997.3 GB │
│ 2 │ 1762 │ 1725 │ sudo │ Sleeping │ 0.00 │ 2.5 MB │ 309.2 GB │
│ 3 │ 1725 │ 1724 │ bash │ Sleeping │ 0.00 │ 3.5 MB │ 222.2 GB │
│ 4 │ 1763 │ 1762 │ nu │ Running │ 0.00 │ 18.4 MB │ 150.1 GB │
╰───┴──────┴──────┴──────┴──────────┴──────┴──────────┴──────────╯
Sort řadí od nejmenšího, takže je ještě potřeba výstup obrátit.
~/bin> ps | sort-by mem | reverse
╭───┬──────┬──────┬──────┬──────────┬──────┬──────────┬──────────╮
│ # │ pid │ ppid │ name │ status │ cpu │ mem │ virtual │
├───┼──────┼──────┼──────┼──────────┼──────┼──────────┼──────────┤
│ 0 │ 1763 │ 1762 │ nu │ Running │ 0.00 │ 18.4 MB │ 150.1 GB │
│ 1 │ 1725 │ 1724 │ bash │ Sleeping │ 0.00 │ 3.5 MB │ 222.2 GB │
│ 2 │ 1762 │ 1725 │ sudo │ Sleeping │ 0.00 │ 2.5 MB │ 309.2 GB │
│ 3 │ 1 │ 0 │ init │ Sleeping │ 0.00 │ 339.9 kB │ 997.3 GB │
│ 4 │ 1724 │ 1 │ init │ Sleeping │ 0.00 │ 249.8 kB │ 997.3 GB │
╰───┴──────┴──────┴──────┴──────────┴──────┴──────────┴──────────╯
Zajímají jen Running procesy, takže můžeme využít sloupce status.
~/bin> ps | sort-by mem | reverse | where status == Running
╭───┬──────┬──────┬──────┬─────────┬──────┬─────────┬──────────╮
│ # │ pid │ ppid │ name │ status │ cpu │ mem │ virtual │
├───┼──────┼──────┼──────┼─────────┼──────┼─────────┼──────────┤
│ 0 │ 1763 │ 1762 │ nu │ Running │ 0.00 │ 18.7 MB │ 150.1 GB │
╰───┴──────┴──────┴──────┴─────────┴──────┴─────────┴──────────╯
Můžeme si tabulku zjednodušit tím, že nás zajímají jen sloupce pid, name a mem.
~/bin> ps | sort-by mem | reverse | where status == Running | select pid name mem
╭───┬──────┬──────┬─────────╮
│ # │ pid │ name │ mem │
├───┼──────┼──────┼─────────┤
│ 0 │ 1763 │ nu │ 18.7 MB │
╰───┴──────┴──────┴─────────╯
Nakonec si pomocí příkazu get vytáhneme jen PID procesu.
~/bin> ps | sort-by mem | reverse | where status == Running | select pid name mem | get pid
╭───┬──────╮
│ 0 │ 1763 │
╰───┴──────╯
A tohle je jen takové škrabkání po povrchu. Nu disponuje škálou příkazů na práci s tabulkami. Také na práci se záznamy což je JSON, seznamy a řetězci. Vše je pěkně popsáno v dokumentaci v sekci Nu Fundamentals.
Nushell jede na Windows, macOS a Linux operačních systémech. Metody instalace jsou popsány v dokumentaci. Pro Debian/Ubuntu systém stačí přidat zdroj.
curl -fsSL https://apt.fury.io/nushell/gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/fury-nushell.gpg
echo "deb https://apt.fury.io/nushell/ /" | sudo tee /etc/apt/sources.list.d/fury.list
sudo apt update
sudo apt install nushell
Nushell není kompatibilní s Bashem a jinými tradičními shelly. Takže není kompletní náhrada za standardní systémový shell. Ale dokáži si představit Nu jako "every day" shell na takovou běžnou uživatelskou Linuxařinu. Ale ještě víc pokud z mého programu potřebuji zpracovat strukturovaný výstup nebo naopak do mého programu dostat strukturovaný vstup. To může být velice silný nástroj. Nushell tvrdí že dokáže pracovat s JSON, YAML, Excel a dokonce i s SQLite. To může některé aplikace velice zjednodušit. Seznam všech podporovaných formátů najdete v dokumentaci.
Happy coding!
![]()






