生成校验和的可能命令
不幸的是,没有标准的工具可以生成加密校验和。有一个标准工具来生成一个CRC:cksum
; 这可能足以满足您在非敌对环境中检测变化的目的。
我建议使用SHA1而不是MD5。拥有MD5实用程序但没有SHA1的系统并不多,如果要使用加密校验和,则最好使用没有已知方法的算法来查找冲突(假设您还要检查大小)。
OpenSSL是一种非标准但通用且可以计算摘要的工具。它可用于Cygwin,Debian和OSX,但不幸的是,它不是OSX默认安装的一部分。
openssl dgst -sha1
在OSX 10.6上,有一个shasum
实用程序,它在Debian中也存在(它是perl
软件包的一部分),我也相信Cygwin。这是一个Perl脚本。大多数的Unix系统都安装了Perl,因此,如果您担心该脚本无处不在,可以将该脚本与makefile捆绑在一起。
为您的系统选择正确的命令
好的,假设您真的找不到在任何地方都可以使用的命令。
在壳
使用type
内置功能查看命令是否可用。
sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org
GNU make
可以在加载makefile时使用该shell
函数运行shell片段,并将输出存储在变量中。
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
便携式(POSIX)品牌
您只能在rule中运行shell命令,因此每个计算校验和的规则都必须包含查找代码。您可以将代码段放入变量中。请记住,规则中的单独行是独立评估的。还要记住,$
要传递给外壳的符号需要转义到$$
。
determine_sum = \
sum=; \
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
done; \
if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
checksums.dat: FORCE
$(determine_sum); \
$$sum *.org
autotools