Nushell

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!

Loading