shrsとは

site: https://mrpicklepinosaur.github.io/shrs/

RustでShellを構築できるフレームワーク
フレームワークなので自由自在にロジックを構築することができる。

Of course it is blazingly fast

Rust製なのでもちろんめちゃくちゃ速いよ

例えば最低限動くshellの実装はこんな感じ

use shrs::prelude::*;
 
fn main() {
    let shell = ShellBuilder::default().build().unwrap();
 
    let _ = shell.run();
}

使い方

ドキュメントに詳しく書いてある

まず始めにCargo init/newで新しいプロジェクトを作成する。 次にCargo.tomldependenciesshrs = { version = "0" }と追記して依存関係を追加する。

そして./src/main.rsに冒頭に記載したサンプルコードを書く。

その後cargo runを実行するとshellが起動する。lsとかcatとかPOSIXにあるコマンドは大体使えそう。

設定に必要なものは全てuse shrs::prelude::*;を経由してexportされてるっぽいので、これだけuseすれば大丈夫そう

alias

こんな感じでaliasの設定ができる。

    let alias = Alias::from_iter([
        ("ls", "lsd"),
    ]);
 
    let shell = ShellBuilder::default().with_alias(alias).build().unwrap();
    let _ = shell.run();

aliasにはPATHにあるコマンドとかも普通に書けるらしい。

Hooks

Shellで特定のイベントが発生した際に任意の処理を実行できる機構。結構使えそう。

let mut hooks = Hooks::new();
let startup_msg: HookFn<StartupCtx> = |_sh: &Shell,
                                       _sh_ctx: &mut Context,
                                       _sh_rt: &mut Runtime,
                                       _ctx: &StartupCtx|
-> anyhow::Result<()> {
    let welcome_str = "Welcome!";
    println!("{welcome_str}");
    Ok(())
};
hooks.register(startup_msg);
 
// with_aliasを書いた場所のすぐ下に追記する。
.with_hooks(hooks)

これで起動したときに**Welcome!**と表示される。 これの使い道として、起動時にネットから取得した情報を表示するとかがありそう。

// 時間があったら他にも追加していきます

所感

  • ドキュメントと実際の挙動に齟齬があるので、ドキュメントの方を読んでイメージを掴んでその後docs.rsの方を読むと良さそう。構造体の名前とかはドキュメントよりもLSPの方が信頼できる。
  • 「設定を読み込みが遅いなら、埋め込んでしまえば良いじゃない」を地で行く戦法
  • 補完が効くとはいえスクリプトと比べてちょっと書きづらい気もする
  • それでも起動速度が爆速なのでスピードを求めるならかなり有力な選択肢になりそう