2012/12/24

bash built-in test([)コマンドと、/usr/bin/test (/usr/bin/[)の挙動違い

bash built-in test([)コマンドと、/usr/bin/test (/usr/bin/[)の挙動違いでハマってしまいました。

x -ot y でファイルの新旧を調べようとして、
  • bashビルトインのtest/[は、 xが存在しないとFalse
  • /usr/bin/test、/usr/bin/[は、xが存在しないとTrue
まあ、違うものなので動きが違うのは構わないといえば構わない(ひょっとしてファイル未存在の場合の挙動は未定義なのかな?)のですが、微妙に動きが違って混乱してしまったので、メモ。
 
#!/bin/sh
rm a
touch b

if /usr/bin/test ./a -ot ./b; then echo "T"; else echo "F"; fi
if /usr/bin/[ ./a -ot ./b ]; then echo "T"; else echo "F"; fi
if test ./a -ot ./b; then echo "T"; else echo "F"; fi
if [ ./a -ot ./b ] ; then echo "T"; else echo "F"; fi
で、実行結果は
 
$ ./testtest.sh
T
T
F
F
ふむ。そーゆーものであるのか。

0 件のコメント: