md5sum lệnh nhị phân và chế độ văn bản


13

Lệnh GNU md5sumcó hai chế độ: chế độ nhị phân và chế độ văn bản . Tôi đoán sự khác biệt chỉ là về cách xử lý các ký tự dòng mới? Tôi có đúng không

Trên GNU / Linux, hai chế độ luôn tạo ra kết quả giống nhau, vì vậy việc sử dụng -b-ttùy chọn duy nhất là chỉ ra cờ ( *hoặc ) được sử dụng trước tên tệp?

Trong hoàn cảnh nào các chế độ có thể tạo ra kết quả khác nhau? Trên hệ thống Windows / MacOS? (Phiên bản cho các nền tảng này có sẵn?)

Câu trả lời:


11

Trên GNU / Linux, hai chế độ luôn tạo ra kết quả giống nhau

Vâng, rõ ràng. Từ man md5sum:

Lưu ý: Không có sự khác biệt giữa tùy chọn chế độ nhị phân và chế độ văn bản trên hệ thống GNU [sic].

Đây là từ việc md5sumtriển khai các tàu với GNU coreutils 8.21; Tôi nhận thấy một phiên bản cũ hơn (8.12) không có thông báo này nhưng tôi cho rằng điều tương tự cũng sẽ đúng.

Mặc dù AFAICT md5sumkhông được chuẩn hóa chính thức (ví dụ, bởi POSIX), nó có sẵn trên nhiều nền tảng khác nhau trong các triển khai khác nhau và rõ ràng có một số nỗ lực để làm cho các thiết bị này tuân thủ với nhau để dễ sử dụng trên các hệ thống.

Liên quan đến vấn đề này, Tiêu chuẩn ISO / ANSI C bao gồm các chức năng truyền phát mức cao để truy cập các tệp. Là một phần của tiêu chuẩn, chúng có sẵn trên bất kỳ hệ điều hành nào thực hiện ISO C thông qua thư viện dùng chung hoặc trình biên dịch. Vì hầu hết tất cả các hệ điều hành đều có sẵn điều này (và bản thân chúng thường được viết bằng C), đây là một loại ngôn ngữ phổ quát được sử dụng để triển khai phần mềm rất có khả năng di động.

Xem xét những gì nó làm, nó sẽ hoàn toàn khả thi để viết một md5sumcái sẽ biên dịch và làm việc trên bất kỳ hệ điều hành nào. Tôi không khẳng định điều này đúng với phiên bản GNU coreutils, nhưng một trong những chức năng luồng tệp cấp cao được đề cập trước đó là fopen(), được ISO C ủy quyền bao gồm một bcông tắc được sử dụng để mở tệp để cho biết nó đang được mở "dưới dạng nhị phân tập tin". Điều đó có thể có nghĩa là gì hoặc yêu cầu của hệ thống không được quy định bởi tiêu chuẩn, nó chỉ bắt buộc tồn tại để nó có thể được sử dụng trên hệ thống nơi có thể có một số ( bất kỳ ) lý do nào cho nó.

Không có lý do nào như vậy trên các hệ điều hành kiểu linux / POSIX / * nix, vì vậy việc chuyển đổi không làm gì cả. Từ thông số POSIX (siêu bộ của ISO C) cho fopen () :

Ký tự 'b' sẽ không có hiệu lực, nhưng được phép tuân thủ tiêu chuẩn ISO C.

Vì vậy, md5sumviệc triển khai hoàn toàn di động có thể sử dụng các hàm luồng tệp mức cao ISO, vì không có phương pháp nào khác để truy cập tệp trong ISO C (hầu hết các nền tảng, bao gồm cả các khiếu nại POSIX, cũng có các phương thức cấp thấp hơn, nhưng sử dụng các phương pháp này sẽ không thể mang theo được vì chúng không nằm trong ISO C) và nó cũng nên thực hiện các cờ -b-tđể thêm hoặc không thêm btùy chọn fopen()khi nó đọc tệp. Trên các hệ thống mà điều đó là vô nghĩa, nó sẽ không tạo ra bất kỳ sự khác biệt nào.

Một lần nữa, tôi không nói rằng md5sum của GNU được viết theo cách hoàn toàn di động hoặc có nguồn gốc từ đó, nhưng rõ ràng là nó đang cố gắng tuân thủ, trong khả năng hoạt động của nó, với khả năng hoạt động của nó. Lưu ý rằng có một cờ không có gì không giống như không có cờ - trong trường hợp trước, nó được chỉ định là ổn nhưng không làm gì cả, trong trường hợp sau đó sử dụng nó có thể là một lỗi hoặc dẫn đến hành vi không xác định .


1
Tại sao các tùy chọn này được thêm vào nếu chúng vô dụng?
ngọn lửa đóng băng

1
Tôi đã thêm một số đoạn trên về điều này (TL; DR -> để khiếu nại với các phiên bản của người dùng md5sum có thể quen thuộc với các hệ điều hành khác và mã lô, v.v. được viết như vậy).
goldilocks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.