発生日:2026年7月25日。 コマンド自体は何の結果も生成しないにもかかわらず、1つのコロンがシェルスクリプト内で有用な処理を実行できる。開発者フィリップ・ロセーンによる技術解説は、シェルのnullコマンドである`:`を検討し、何もしないよう定義された構文でも、シェルがそれに付随するものを評価する際には価値を持ち得る理由を示している。

重要な違いは、コロンコマンドと、それに渡される式との間にある。この組み込みコマンドは引数を受け取り、シェルにその引数を評価させた後、得られた値を破棄する。この動作により、スクリプトは展開されたテキストをコマンドとして実行しようとすることなく、副作用を得るためにパラメーター展開を呼び出せる。ロセーンはコロンを古い機能だと説明し、その起源を1971年のThompson shellまでさかのぼっている。そこではラベルや初期のコメント記号としても使われていた。

実用的なパターンの一つは、`:`とシェルのパラメーター展開を組み合わせるものだ。`${name:?diagnostic}`のような式は、変数が未設定または空かどうかを確認する。該当する場合、シェルは指定された診断メッセージを標準エラーに書き込み、ゼロ以外のステータスで終了する。値がある場合、展開によってその値が生成される。展開の前にnullコマンドを置けば、結果の値を破棄しつつ確認が行われる。これにより、変数固有のエラーメッセージを保ちながら、複数行の引数検証分岐を簡潔な文に変えられる。

関連する用法では、代入形式のパラメーター展開を利用する。`:`が最終的な値を無視する場合でもシェルは展開を行うため、展開の出力をプログラム名として扱うことなくデフォルト値を代入できる。この手法は簡潔だが、適切かどうかは保守担当者が構文を理解しているかに左右される。ロセーンは、明示的な条件分岐コードの普遍的な代替手段としてではなく、学ぶ価値のある選択肢として紹介している。

Nullコマンドは、シェルがコマンドを必要とするものの、作者が何も実行したくない構文上の位置を埋めることもできる。これは、すべての空の分岐にコロンを入れるべきだと主張するのとは異なる。解説で挙げられた一例では、自動squashを伴うインタラクティブなrebaseの際、`:`をGitのシーケンスエディターとして使用しており、意図的に編集を一切行わないままエディターのフックを満たしている。

より広い教訓は、シェルによる評価とコマンド実行は別々の段階だということだ。コロンのコマンドとしての動作は意図的に空だが、それに付加された展開は、変数の検証、デフォルト値の設定、コマンドを必要とするコンテキストへの対応に利用できる。慎重に使えば、この機能は簡潔で移植性のあるツールとなる。一方、説明なしに使えば、数行のコードを減らす代わりに分かりにくさを招く可能性がある。その価値は隠された特殊処理ではなく、予測可能なシェルのセマンティクスに由来する。だからこそ、この省略記法を採用する前に、いつ展開が行われるのかを知ることが不可欠だ。