実際のところ別に/bin/[要らないよねという話

前にTLで話題になってたけど記憶からほぼ飛んでいたのでブログに書いとく。

/bin/shbashになってたりすると困るからFreeBSDで試したけど別にLinuxでもOSXでもそんなに変わらないはず。
標準シェルがbashの状態で/bin/[(別のOSでは/usr/bin/[かもしれない)を使えなくしても、builtin commandなので普通に動く。

[syuu@vm0 ~]$ which [
/bin/[
[syuu@vm0 ~]$ sudo mv /bin/[ /bin/[.bak
[syuu@vm0 ~]$ if [ 1 -eq 1 ] ;then echo 1;fi
1
[syuu@vm0 ~]$ /bin/sh
$ if [ 1 -eq 1 ]; then echo 1 ; fi
1
$

ってなわけで別に普段シェルスクリプト書いてても使ってないよね。

(shとbash以外で if [ cond ] と書くシェルで、かつ/bin/[をbuiltinしてないシェルもあるのかな? あるとすればどれだろう?)

標準規格で入れとけと決まってるのかもしれないし、まぁこれに限らずこういう状態のコマンドは多分あるよね。

追記

ashというリクエストが来たので試してみた。

$ sudo aptitude install ash
The following NEW packages will be installed:
  ash 
0 packages upgraded, 1 newly installed, 0 to remove and 136 not upgraded.
Need to get 6,178 B of archives. After unpacking 69.6 kB will be used.
Get: 1 http://jp.archive.ubuntu.com/ubuntu/ raring/universe ash all 0.5.7-3ubuntu1 [6,178 B]
Fetched 6,178 B in 0s (17.6 kB/s)
Selecting previously unselected package ash.
(Reading database ... 185013 files and directories currently installed.)
Unpacking ash (from .../ash_0.5.7-3ubuntu1_all.deb) ...
Processing triggers for man-db ...
Setting up ash (0.5.7-3ubuntu1) ...
$ sudo mv /usr/bin/[ /usr/bin/[.bak
$ ash
$ if [ 1 -eq 1 ];then echo 1 ;fi
1
$ which [
$ exit