実は独立した実行ファイルだった!Linuxの角括弧「[」コマンドの動作原理と終了ステータス活用ガイド

概要

Bashなどのシェルスクリプトで見かける角括弧「[」を、プログラミング言語特有の構文記号やただの括弧だと思っていませんか?実はLinuxの世界において、この記号はOS上に実在する独立したコマンドの一つです。本記事では、普段何気なく使っている「[」コマンドの裏側の仕組みやバイナリとしての実態を解き明かし、シェルが返す終了ステータス($?)を正確にハンドリングして条件判定に活かす実践ノウハウを詳しく解説します。

1. 「[」コマンドの実体を暴く:バイナリ配置場所とシェルの探索機構

まずはターミナル上で which [ を実行し、ファイルシステム内に「[」という名前のプログラムが実在するかパスを調査してみましょう。
実行結果として /usr/bin/[ が返され、この記号が単なるシェルの装飾構文ではなく、OSに常駐する独立した実行ファイルであることが明確に確認できます。
⚙️ [主要オプション一覧]

-f : 対象が通常のファイル(regular file)であるかを判定します。
-d : 指定パスがディレクトリであるかを検証します。
-e : ファイルやディレクトリが存在しているかをチェックします。
-z : 文字列の長さが0(空文字)であるかを評価します。
-n : 文字列に1文字以上のデータが含まれているかを調べます。
= : 2つの文字列が完全に同一であるかを比較します。
-eq : 数値同士が等しいか(equal)を比較します。
-ne : 数値同士が一致しないか(not equal)を比較します。

whichコマンドによる実行ファイルの探索

続いて type -a [ を投入し、カレントシェル環境がこのコマンドをどのように認識・優先順位付けして実行しているかを深掘りします。
出力ログを見ると、パフォーマンス向上のためにシェル組み込みコマンド(shell builtin)が最優先で呼び出される設計になっており、同時に外部バイナリとして /usr/bin/[ や /bin/[ にも配備されている二重構造が読み取れます。

typeコマンドでビルトインと外部バイナリを確認

さらに ls -l /usr/bin/[ を通じて、ファイルシステム上のファイルプロパティを直接確かめてみます。
パーミッション欄に実行権限(-rwxr-xr-x)が付与されたバイナリファイルとして、ストレージ上に確かに記録されていることが視覚的にも把握できます。

lsコマンドで角括弧バイナリの詳細属性を表示

2. 「[」コマンドの基本作法と終了ステータス($?)の評価ロジック

数値の大小関係をチェックするため、[ 10 -gt 5 ] を実行してみます(-gt は greater than を意味する比較演算子)。
「[」コマンドは評価処理に成功しても標準出力へ文字列を表示することはなく、結果の成否を静かに内部コードとして保持します。

角括弧コマンドによる数値比較の実行

直前に実行されたプロセスの終了結果を拾い上げるため、echo $? を呼び出します。
画面に 0 が出力されますが、Linuxの規約においてこれは「エラーなし・条件成立(True)」を意味する正常ステータスです。

直前の終了ステータスコードを画面表示

次に不成立となる条件を試すため、[ 10 -lt 5 ](-lt は less than)を実行してみましょう。
先ほどと同様にターミナル上には何も印字されず、判定結果はシェル内部の終了ステータス領域へ書き込まれます。

条件不成立となる数値比較コマンドのテスト

再び echo $? を実行して、条件判定後のステータス番号をチェックします。
真偽値が「偽(False)」となったことで非ゼロの終了ステータスが返され、処理の成否がプログラム的に判別可能であることが分かります。

条件不成立時の終了ステータスを確認

3. ファイルシステム検証のハンズオン(-f、-d、-s オプション)

ファイルやディレクトリの属性判定を検証するため、mkdir -p /tmp/bracket_test && touch /tmp/bracket_test/sample.txt を実行して検証用の作業ディレクトリと空のファイルを生成します。

テスト用ディレクトリとサンプルの空ファイルを作成

ファイル種別のチェックを行うため、[ -f /tmp/bracket_test/sample.txt ] && echo "파일이 정상적으로 존재합니다" を実行します。
対象パスが通常ファイルであるため条件式が真(True)となり、論理積演算子 && によって後続のメッセージ出力がトリガーされます。

ファイル存在確認とメッセージ出力の連携

ディレクトリ検証を行うため、[ -d /tmp/bracket_test ] && echo "디렉터리가 맞습니다" を投入します。
指定先が正しくディレクトリとして認識され、コマンドが正常終了(ステータス0)を返したことで案内文が表示されます。

ディレクトリの存在検証テスト

最後にファイルサイズの有無を測るため、[ -s /tmp/bracket_test/sample.txt ] || echo "파일 크기가 0(비어있음)입니다" を実行してみましょう。
先ほど touch で作成したファイルは中身が空(容量0バイト)であるため、条件式が不成立(False)となり、論理和演算子 || の右側にある通知メッセージが実行されます。

空ファイル判定によるフォールバック処理の動作検証

4. シェルスクリプトでの実戦応用:if構文と短縮評価の組み合わせ

ファイルサイズに応じた分岐処理をシミュレートするため、echo "Ubuntu Shell Test" > /tmp/bracket_test/sample.txt を実行してファイル内へ文字列を流し込みます。

テストファイルへのテキストデータ書き込み

実務スクリプトの定番である if 構文と組み合わせ、if [ -s /tmp/bracket_test/sample.txt ]; then echo "내용 확인: $(cat /tmp/bracket_test/sample.txt)"; fi を走らせます。
今度はファイルサイズが0より大きいという条件(-s)が真となるため、then 節のブロックが処理され、ファイルの中身が展開されて端末に出力されます。

if構文と角括弧コマンドを連携した条件分岐処理

検証が完了したら、環境をクリーンな状態へ戻すために rm -rf /tmp/bracket_test で作業ディレクトリ一式を削除します。

検証用ディレクトリとファイルのクリーンアップ

シェル上で見慣れた角括弧「[」が、実は独立したバイナリコマンドであり、終了ステータスを通じて論理演算を成立させているメカニズムを確認しました。
この内部動作を理解しておくと、Bashスクリプトでの条件式の構文ミスを未然に防ぎ、より堅牢で保守性の高いコード設計が可能になります。