魅惑の自作シェルの世界
Sat Feb 4 15:43:08 JST 2023 (modified: Sun Nov 30 17:31:47 JST 2025)
views: 23842, keywords:rusty_bash, Software Design, 連載
技術評論社Software Designにて2022年12月号より連載中。購入はこちらからできます!
どんな連載なのか?
記事に出てくる用語集
シェルの用語(連載独自のものを含む)
- サブシェル: シェルがフォークしてできるシェルのプロセス
- サブワード: 単語の部品(部分文字列や変数展開、コマンド置換など)
- ジョブ: AND/ORリストや単独のパイプラインのこと
- スクリプト: (本連載のみ)シェルスクリプトや端末から読み込んだプログラム。文法上、最上位の単位
- 代入コマンド:
local、readonly、declareなど、引数に代入をとれるビルトインコマンドのこと。配列の代入(例:local a=(a b)など)もとることができるので、通常のコマンドと引数のルールが異なる。 - 単語: コマンドやコマンドの引数を表す文字列のこと
- 単語の分割: 空白と改行のまざった単語を、空白と改行を区切り文字として複数の単語に分割すること。
- 単純コマンド:
ls -lなど、ひとつのコマンドの名前+複数の引数で構成されるコマンド。対義語は( echo a ; echo b)やif、forなどの複合コマンド。 - 特殊パターン文字: →ワイルドカード
- 丸括弧コマンド(本連載のみ):
(echo a ; echo b)など、丸括弧で囲うタイプの複合コマンド。一般にサブシェルとも呼ばれる。 - 複合コマンド:
( echo a ; echo b)やif、forなど、複数のコマンドを組み合わせて作られた「コマンド」。パイプラインにつなげられる。 - プロセスグループ: パイプラインにつながったコマンドと、その複合コマンドの子孫のプロセスで構成されるグループ。ジョブやフォア/バックグラウンドの制御、シグナルの送信先などの単位になる。
- 要素(本連載のみ): 「スクリプト」や「ジョブ」などのパースする単位
- ワイルドカード: 単語中の
*や?など、複数の文字列表現を代表する記号。特殊パターン文字。
Rustの用語
?演算子:func()?と関数のうしろにつけたとき、関数がErr型のデータを返すと、即そこでreturnして、そのデータを返す演算子Box<T>: ヒープ領域に型Tのデータを置くときにつかうポインタcargo build: Rustのパッケージをビルドするときのコマンドcargo run: Rustのパッケージをビルドして実行するときのコマンドdbg!: デバッグ出力用のマクロdyn トレイト名: 共通のトレイトを持つ任意の型を表すときの表現方法eprintln!: 標準エラー出力に文字列を出す(デバッグ用)use: 型や関数を使うときにパスを通すために使用Option<T>型: 「なにかデータが1個ある、あるいはない」という状態を表現できる列挙型。列挙子としては、NoneとSome(T)がある。Result<T, E>型: 成功したときに返すデータと、エラーのときに返すデータをそれぞれT、Eという違う型で返せるようにした列挙型。列挙子はOk(T)とErr(E)。アトリビュート: 構造体に対して与える
#[...]という記述関連関数: たとえば構造体
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でプログラムを立ち上げるための重要な機能の一つ。
ノート
Tweet