Rust 製の Nushell を触ってみる。

こんにちは k-jun です。今回は Rust 製の Nushell を試してみようと思います。

https://github.com/nushell/nushell

ご丁寧にめちゃくちゃ長いドキュメントが存在しています。何やら書いてあることは良さげです。

https://www.nushell.sh/book/

rather than trying to be the jack of all trades, Nu focuses its energy on doing a few things well: Create a flexible cross-platform shell with a modern feel. Allow you to mix and match commandline applications with a shell that understands the structure of your data. Have the level of UX polish that modern CLI apps provide.

Docker で試せるようなので試してみます。

docker run -it quay.io/nushell/nu:latest
...
Welcome to Nushell 0.21.0 (type 'help' for more info)
/> help
Welcome to Nushell.

Here are some tips to help you get started.
  * help commands - list all available commands
  * help <command name> - display help about a particular command

Nushell works on the idea of a "pipeline". Pipelines are commands connected with the '|' character.
Each stage in the pipeline works together to load, parse, and display information to you.

[Examples]

List the files in the current directory, sorted by size:
    ls | sort-by size

Get information about the current system:
    sys | get host

Get the processes on your system actively using CPU:
    ps | where cpu > 0

You can also learn more at https://www.nushell.sh/book/
/>

プロンプトが /> なの結構好きですね。ひとまず書いてあるコマンドを試してみる。

/> ls | where name == "bin"
───┬──────┬──────┬────────┬───────────────
 # │ name │ type │  size  │   modified
───┼──────┼──────┼────────┼───────────────
 0 │ bin  │ Dir  │ 4.1 KB │ 11 months ago
───┴──────┴──────┴────────┴───────────────
/> ls
────┬───────┬──────┬────────┬───────────────
 #  │ name  │ type │  size  │   modified
────┼───────┼──────┼────────┼───────────────
  0 │ bin   │ Dir  │ 4.1 KB │ 11 months ago
  1 │ boot  │ Dir  │ 4.1 KB │ 3 years ago
  2 │ dev   │ Dir  │  360 B │ 6 mins ago
  3 │ etc   │ Dir  │ 4.1 KB │ 6 mins ago
  4 │ home  │ Dir  │ 4.1 KB │ 3 years ago
  5 │ lib   │ Dir  │ 4.1 KB │ 11 months ago
  6 │ lib64 │ Dir  │ 4.1 KB │ 11 months ago
  7 │ media │ Dir  │ 4.1 KB │ 11 months ago
  8 │ mnt   │ Dir  │ 4.1 KB │ 11 months ago
  9 │ opt   │ Dir  │ 4.1 KB │ 11 months ago
 10 │ proc  │ Dir  │    0 B │ 6 mins ago
 11 │ root  │ Dir  │ 4.1 KB │ 6 mins ago
 12 │ run   │ Dir  │ 4.1 KB │ 11 months ago
 13 │ sbin  │ Dir  │ 4.1 KB │ 11 months ago
 14 │ srv   │ Dir  │ 4.1 KB │ 11 months ago
 15 │ sys   │ Dir  │    0 B │ 6 mins ago
 16 │ tmp   │ Dir  │ 4.1 KB │ 11 months ago
 17 │ usr   │ Dir  │ 4.1 KB │ 11 months ago
 18 │ var   │ Dir  │ 4.1 KB │ 11 months ago
────┴───────┴──────┴────────┴───────────────

なるほど...。Unix の哲学である Pipeline の実装を、モダンなデータ型で結合出来るようにしているんですね...。これは確かに強力...。 普通の string 型の出力結果に where を当てようとすると以下のように Error に。

/> ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 nu
   30 pts/0    00:00:00 sh
   34 pts/0    00:00:00 ps
/> ps | where cpu > 0
error: Type Error
  ┌─ shell:1:1
  │
1 │ ps | where cpu > 0
  │ ^^ Expected row or table, found string

なかなかクセが強そうです。echo で 書き込みが上手く出来ない...

/> echo "hello world \n good bye" >> test
───┬─────────────────────────
 0 │ hello world \n good bye
 1>>
 2test
───┴─────────────────────────
/> ls -l test
───┬──────┬──────┬────────┬───────────┬──────────┬───────────┬──────┬───────┬──────┬───────────┬───────────┬───────────
 # │ name │ type │ target │ num_links │ readonly │   mode    │ uid  │ group │ size │  created  │ accessed  │ modified
───┼──────┼──────┼────────┼───────────┼──────────┼───────────┼──────┼───────┼──────┼───────────┼───────────┼───────────
 0test │ File │        │ 1         │ No       │ rw-r--r-- │ root │ root  │  0 B │ 1 min ago │ 1 min ago │ 1 min ago
───┴──────┴──────┴────────┴───────────┴──────────┴───────────┴──────┴───────┴──────┴───────────┴───────────┴───────────

どうやらこういうことらしい...。

/> echo "hello world \n good bye" | save test
/> cat test
hello world \n good bye

サクッと試してみただけですが、簡単に移行は出来なさそうですね...。最初っから Nushell を使って使いこなせるようになればもしかして作業効率が劇的に上がったりするのだろうか...?

それでは今回はこのへんで..。