けけずんセルフハッキング

エンジニアっぽい雰囲気を醸しだしているかのようなブログです!

/bin/[ という謎コマンドがあった

はじめに

気まぐれで macOS*/bin なフォルダの中にどんなコマンドがあるのか気になったので調べてみた、そしてまず最初にコマンドっていくつあるの、というのが前回の話。

kkznch.hatenablog.com

今回はなんとなく /bin からとっついてみようと思い、以下のコマンドを実行してみた。

$ ls -l /bin | head
total 4888
-rwxr-xr-x  1 root  wheel    35824 12  5 18:33 [
-r-xr-xr-x  1 root  wheel   623344 12  5 18:33 bash
-rwxr-xr-x  1 root  wheel    36768 12  5 18:33 cat
-rwxr-xr-x  1 root  wheel    47296 12  5 18:33 chmod
-rwxr-xr-x  1 root  wheel    42272 12  5 18:33 cp
-rwxr-xr-x  1 root  wheel   528688 12  5 18:33 csh
-rwxr-xr-x  1 root  wheel   110848 12  5 18:33 dash
-rwxr-xr-x  1 root  wheel    41728 12  5 18:33 date
-rwxr-xr-x  1 root  wheel    45168 12  5 18:33 dd

ls/bin の中にあるコマンドをリスト形式で取得し、 head でリストの頭から10行を表示させている。

見慣れたコマンドの中に謎の記号がいるのが分かるだろうか。

/bin/[

そう、 /bin/[ こいつである。 え、コマン...ド?コマンドなの?と最初は思った。

ここで man [ を実行してこいつが何者なのかを見てみる。

TEST(1)                   BSD General Commands Manual                  TEST(1)

NAME
     test, [ -- condition evaluation utility

SYNOPSIS
     test expression
     [ expression ]

略

test と同じっぽい

なるほどどうやら test というコマンドと同じ内容らしい。 test 条件 で与えられた条件の判定を行うことができる。

例えば test で指定したフォルダが存在しているか確認したい場合、以下のように実行する。

$ test -d Library
$ echo $?
0

test で Library といフォルダが存在しているか確認し、echotest の実行結果を表示している。 echo $? の結果が 0 のときは Library フォルダが存在しており、1 のときは存在していないことになる。

/bin/[ で書いてみる

これを [ で書くと以下のようになる。

$ [ -d Library ]
$ echo $?
0

どこかで見たことあると思ったら、 Shellscript で if 文を書くときに評価される箇所と同じだなと思った。

Shellscript だとこんな感じかな。

if [ -d Library ]; then
  なんか処理実行する
fi

普段Shellscriptで書いてた if 文の角括弧の正体はこいつだったのか...。