魅惑の自作シェルの世界
Sat Feb 4 15:43:08 JST 2023 (modified: Mon Jun 24 10:34:55 JST 2024)
views: 20606, keywords:rusty_bash, Software Design, 連載
技術評論社Software Designにて2022年12月号より連載中。購入はこちらからできます!
どんな連載なのか?
記事に出てくる用語集
シェルの用語(連載独自のものを含む)
- サブシェル: シェルがフォークしてできるシェルのプロセス
- サブワード: 単語の部品(部分文字列や変数展開、コマンド置換など)
- ジョブ: AND/ORリストや単独のパイプラインのこと
- スクリプト: (本連載のみ)シェルスクリプトや端末から読み込んだプログラム。文法上、最上位の単位
- 単語: コマンドやコマンドの引数を表す文字列のこと
- 単純コマンド:
ls -l
など、ひとつのコマンドの名前+複数の引数で構成されるコマンド。対義語は( echo a ; echo b)
やif
、for
などの複合コマンド。 - 丸括弧コマンド(本連載のみ):
(echo a ; echo b)
など、丸括弧で囲うタイプの複合コマンド。一般にサブシェルとも呼ばれる。 - 複合コマンド:
( echo a ; echo b)
やif
、for
など、複数のコマンドを組み合わせて作られた「コマンド」。パイプラインにつなげられる。 - プロセスグループ: パイプラインにつながったコマンドと、その複合コマンドの子孫のプロセスで構成されるグループ。ジョブやフォア/バックグラウンドの制御、シグナルの送信先などの単位になる。
- 要素(本連載のみ): 「スクリプト」や「ジョブ」などのパースする単位
Rustの用語
Box<T>
: ヒープ領域に型T
のデータを置くときにつかうポインタcargo build
: Rustのパッケージをビルドするときのコマンドcargo run
: Rustのパッケージをビルドして実行するときのコマンドdbg!
: デバッグ出力用のマクロdyn トレイト名
: 共通のトレイトを持つ任意の型を表すときの表現方法use
: 型や関数を使うときにパスを通すために使用Option<T>
型: 「なにかデータが1個ある、あるいはない」という状態を表現できる列挙型。列挙子としては、None
とSome(T)
がある。eprintln!
: 標準エラー出力に文字列を出す(デバッグ用)アトリビュート: 構造体に対して与える
#[...]
という記述関連関数: たとえば構造体
Abc
があったときに、impl Abc {}
のカッコ内に書く関数。引数にself
がなく、インスタンスのデータは操作できない。クレート:
- 1: 外部ライブラリのこと(
Cargo.toml
に一覧を記述) - 2:
main.rs
以下のモジュールのぶら下がった塊のこと
- 1: 外部ライブラリのこと(
サブモジュール: あるモジュールの子供に相当するモジュール。たとえば
feeder.rs
があったら、feeder
ディレクトリの下のソースファイルscanner.rs
をfeeder.rs
でmod scanner;
と読み込むと、scanner
はfeeder
のサブモジュールとなる。トレイト: 複数の異なる構造体に対して共通のメソッドを定義するための仕組み
フィールド: 構造体の構成要素(C++のメンバ変数と同じ)
ミュータブル: 変数やインスタンスが書き換え可能なこと。
メソッド: たとえば構造体
Abc
があったときに、impl Abc {}
のカッコ内に書く関数状の手続きの一種。引数にself
があり、インスタンスのデータを操作できる。モジュール: 本連載ではひとつの
rs
ファイルにまとめられている構造体や関数などの集まりサブモジュール: あるモジュールにぶらさがっているモジュール
列挙型: 定数に名前をつけたラベルのセット。Rustの場合は、ラベルの下にデータをぶら下げることができる。
サンプルコードに関する用語
sush
: 寿司シェルのコマンドとしての名前- 寿司シェル: 本連載で作っているシェル。
eat_...
: パーサーの構造体の関連関数で、パースしている要素のサブの要素をインスタンスに取り込むためのもの。scanner_...
: スキャナ(「その他用語」参照のこと)構造体名::parse
: その構造体の表す要素に対応するパーサー
その他用語
- スキャナ: パーサが使う文字列を走査して、意味のある文字列の位置を教える関数
- バイト数: 本連載では8ビットのこと。正確にはオクテット数。
- フォーク: プロセスを双子のように分裂させる処理。UnixやLinuxでプログラムを立ち上げるための重要な機能の一つ。