Các lệnh có thể để tạo tổng kiểm tra
Thật không may, không có tiện ích tiêu chuẩn để tạo tổng kiểm tra mật mã. Có một tiện ích tiêu chuẩn để tạo CRC : cksum
; điều này có thể đủ cho mục đích phát hiện những thay đổi trong môi trường không thù địch của bạn.
Tôi khuyên bạn nên sử dụng SHA1 thay vì MD5. Không có nhiều hệ thống có tiện ích MD5 nhưng không có SHA1 và nếu bạn sẽ sử dụng tổng kiểm tra mật mã, bạn cũng có thể sử dụng thuật toán không có phương pháp đã biết để tìm xung đột (giả sử bạn cũng kiểm tra kích thước).
Một công cụ không chuẩn nhưng phổ biến và có thể tính toán các tiêu hóa là OpenSSL . Nó có sẵn cho Cygwin, Debian và OSX, nhưng tiếc là không phải là một phần của cài đặt mặc định trên OSX.
openssl dgst -sha1
Trên OSX 10.6, có một shasum
tiện ích, cũng có trên Debian (nó là một phần của perl
gói) và tôi cũng tin vào Cygwin. Đây là một kịch bản Perl. Hầu hết các hệ thống unix đã cài đặt Perl, vì vậy bạn có thể gói tập lệnh đó cùng với tệp tạo tệp của mình nếu bạn lo lắng về tập lệnh này không có sẵn ở mọi nơi.
Chọn lệnh đúng cho hệ thống của bạn
Ok, giả sử bạn thực sự không thể tìm thấy một lệnh hoạt động ở mọi nơi.
Trong vỏ
Sử dụng tích type
hợp để xem nếu một lệnh có sẵn.
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 làm
Bạn có thể sử dụng shell
chức năng để chạy đoạn mã shell khi tệp makefile được tải và lưu trữ đầu ra trong một biến.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Di động (POSIX)
Bạn chỉ có thể chạy các lệnh shell trong quy tắc, vì vậy mỗi quy tắc tính toán tổng kiểm tra phải chứa mã tra cứu. Bạn có thể đặt đoạn mã trong một biến. Hãy nhớ rằng các dòng riêng biệt trong các quy tắc được đánh giá độc lập. Cũng cần nhớ rằng $
các dấu hiệu được truyền vào vỏ cần phải được thoát ra $$
.
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