builtinコマンド

id:cocelo:20060707#1152260319(i-node 値と test(1) について)のコメント欄が盛り上がっているので便乗。
(基本コマンドにgnuの物が使われている)Linuxを使ってるとtestがbashに組み込まれているのがわかりやすい気がする。以下のスクリプトを書く(test.sh)

if test -l $HOGE -ge 4
then
        echo hoge
else
        echo foo
fi

testコマンドのあとの-lオプションは引数の文字数を数える特殊な式でtestのマニュアルにも書いてある。
だけどこれを実行しても

$ HOGE=hoge;export HOGE
$ sh test.sh
test.sh: line 2: test: -l: unary operator expected
foo

-lなんて知らないよと怒られてしまう。
なのでtest.shの1行目を書き換える(ここではtestコマンドは/usr/bin/testにあるとする)

if /usr/bin/test -l $HOGE -ge 4

で実行すると$HOGEの文字数に応じた処理が行われる事になる。*1
普段から組み込みでないtestや[を使いたいならそのスクリプト中にenable -n testやらenable -n test [ echoやら書いておくとすっきりかける。
FreeBSDの場合の組み込みと非組み込みのtestの違いやbashじゃない場合はどうだかわかんないやorz

追記:

test と [ が等価なのは間違いありませんが,それは /bin/test と /bin/[ が hard link だからではありません。test と [ が等価になるように作ってあるからです。

コメント欄のこれはtestと[が等価なのは両方とも組み込みコマンドで同じ機能が呼び出されるからでというのは良いとして、FreeBSDの/bin/testと/bin/[はハードリンクだと思うのだけど…

さらに追記:
FreeBSDに入ってるtestには-l無いのでこれは試せない

*1:ちなみにうちのLANTANKに入ってるdebian26では[とtestはハードリンクではなくて別ファイル