id:eel3:20130826:1377522419 と似たようなパターンのネタ。
相変わらずbusyboxな組込みLinux環境で作業していて、バイナリファイルを比較しようとしたらcmp(1)が無かった。dirname(1)に引き続き2度目……。
組み込んであるbusyboxのdiffがバイナリファイルに対応しているか分からなかったので、その場は比較対象のファイルをcksum(1)*1にかけてチェックサムを比較する方法で逃げた。
また同じような事態が発生した時のことを考えて、後でシェルスクリプト化してみた。
#!/bin/sh readonly SUMCMD=md5sum progname=`basename $0` if [ $# -ne 2 ]; then echo "usage: $progname file1 file2" 1>&2 echo 'dirty hack cmp - substutute of cmp(1)' 1>&2 exit 2 fi for i; do if [ ! -f "$i" ]; then echo "$progname: $i: Invalid argument" 1>&2 exit 2 fi done f1sum=`$SUMCMD "$1" | cut -d " " -f 1` f2sum=`$SUMCMD "$2" | cut -d " " -f 1` if [ "$f1sum" != "$f2sum" ]; then echo "$@" "Not equal" 1>&2 exit 1 fi exit 0
単純に一致/不一致を調べるだけならこれで十分なはず。ハッシュの衝突が起きない限り……マシンパワーとの兼ね合いもあるけど、md5sum(1)あたりを使っていればハッシュの衝突なんてまず起きないだろう(理論的には可能性はあるけど)。
*1:後でmd5sum(1)が組み込まれていたことに気づき、cksum(1)から変更した。