たなしょのメモ

日々勉強していることをつらつらと

Rustで簡易なシェルを作成する

今回はRustの勉強ついでに簡単なシェルを作成してみようと思います。

今回作るシェルについて

今回作るシェルは下記の機能があるシェルを作成します。

  1. cd
  2. Unix準拠のコマンド
  3. コマンドのオプションへの対応
  4. パイプライン

Rustで作成してみる

処理は大まかに以下のようになりました。

  1. 標準入力を読み込む
  2. "|"で文字列を区切る
  3. 2.で区切った文字列をさらに"空白"で区切る
  4. 3.で区切った文字列を順番に取り出して各コマンドを実行する

大まかなソースコードは以下のリンク先にあります。 https://github.com/jacoloves/rust-shell/blob/master/src/main.rs

苦労した点

苦労した点は以下の2点でした。

  1. cdがシェルの中に組み込まれたコマンドだったので、別途作成が必要だった。
  2. パイプラインの実装

1.はPath::newディレクトリのパスを作成して、env::set_current_dirを使用して作業ディレクトリを変更するようにしました。
2.はpeekを使用して、コマンドに続きがあるかを確認して続きが存在する場合はStdio::pipedを使用して親プロセスから子プロセスへのパイプを作成するようにしました。
コマンドの続きがない場合は、Stdio::inheritを使用して親プロセスの処理をそのまま実行するようにしました。

今後について

今回はcdとパイプラインを実装した簡易なシェルを作成しましたが、今後は色々な機能を持ったもう少し大きなシェルを作成してみたいです。

最後に

Rustは色々なライブラリが揃っているので、低いレイヤーのアプリケーションを作成するのにも便利です。