trifle

技術メモ

Rust 製のシェル Nu Shell の設計理念

github.com

www.jonathanturner.org

Rust で書かれたという nushell がはてブで話題になっていたので, 自分もちょっと試していた.
実用で使うにはまだ色々難があるけど, 結構おもしろい.
これから試す人に対する注意点としては, 現状では rustc の中でも直近の nightly でしか動かない. 依存パッケージも非常に多く, 単に機能を試すだけならリリースからバイナリを落とすのが賢明である. ちなみに, rust-toolchain ファイルを置いてバージョンを固定した方がいいのでは〜という issue を立てている rust-toolchain が含まれるようになった.


さて, nushell においては Philosophy(理念) が重要視されているようで, README にも Philosophy が長々と書かれているし, philosophy.md というのをわざわざ別に置いていたりする.
確かに, 既に世の中には zsh やら fish やら xonsh やら便利なシェルがある中で, なぜわざわざ新しいシェルを作る気持ちになったのかを汲み取る上で, この「理念」とやらは重要なのかもしれない. 詳しくは各種ドキュメントで確認するべきだが, 大きく分けて2つあるように見える.

1. あらゆるデータを共通のフォーマットに落とし込み, 少ないコマンドで多様な操作を実現する

README の例にあるように, ls コマンドも ps コマンドも, 出力はテーブルになる. それだけではない. open コマンドで CSVJSON, TOML などのデータファイルを開くと, やはり自動でテーブルに直して表示してくれる.
このように出力が共通のフォーマットに落としこまれることによって, 全く同一のコマンドで操作できるようになるため, (特に初めてシェルを扱うような)ユーザーにとってコマンドの学習コストは格段に下がる.
ちなみに, この機能はWindowsPowerShell から着想を得たそうだ.

考えてみるといいだろう, ls コマンドにも ps コマンドにもそれぞれ大量にオプションがあり, その使い方を把握するためには, 頑張って man ページとニラメッコするか, ググるかしかなかったことを.
nushell が登場したことによって, lsディレクトリだけ表示するときには ls | where type == "Directory" , ps で CPU を使用しているプロセスだけ表示するときには ps | where cpu > 0 と, 同一のやり方を使えばよくなった. そして同じように CSVJSON の中身も表示できるのである.


個人的には, git log あたりも同じようにテーブル表示されたらな〜と思う.

2. スクリーンはいつも一つ 〜 shell から shells へ

作業をしていると端末(スクリーン)が1つでは足りなくなるのは日常茶飯事だろう. 私も tmux を使っている.
nushell はそのような従来の慣習に異を唱える. 端末を複数用意するのではない, 一つの端末で複数のシェルを使えるようにすべきだ, と.
plural shells の世界への移行は簡単だ. enter [path] で新しいシェルが用意される. shells でシェルの一覧を表示したり, n (next), p (previous) で前後のシェルに移動できる.


...とまあ, やや革命的(?)に書いたが, 実際には端末は複数あったほうがいいだろう, 当然...
もし一つの端末で全てを済ませるとして, nushell ユーザーは時間のかかる(端末をしばらく操作できなくなる)プロセスは毎回バックグラウンド実行させないといけないことになってしまうが, それはいいのだろうか.
ちなみに, バックグラウンド実行に対応する bash の記号 & には, nushell はまだ対応していなかった. 大学の面倒なシェル実装の課題が思い起こされる

そもそも, 複数のシェルを用意するというのは, 実態としてはどのように子プロセス生成をしているのだろうか. ゾンビプロセスを防止する仕組みとかはうまく働いているのだろうか. このあたりは有識者がより詳細な解説を日本語で書いてくれることを望みたい.