`test` và` [`- các nhị phân khác nhau, có sự khác biệt nào không?


13

Tôi nhận thấy trong khi trả lời một câu hỏi khác test[là các nhị phân khác nhau, nhưng [trang này kéo lên test. Bên cạnh yêu cầu cho một kết thúc ], có sự khác biệt nào không? Nếu không, tại sao chúng lại tách rời nhị phân thay vì được liên kết với nhau? (Chúng cũng là bashnội trang và bashcũng không hiển thị sự khác biệt.)

Câu trả lời:


4

Các mã nguồn giải thích sự khác biệt như là cách nó xử lý các --helptùy chọn.

  /* Recognize --help or --version, but only when invoked in the
     "[" form, when the last argument is not "]".  Use direct
     parsing, rather than parse_long_options, to avoid accepting
     abbreviations.  POSIX allows "[ --help" and "[ --version" to
     have the usual GNU behavior, but it requires "test --help"
     and "test --version" to exit silently with status 0.  */

Chứng minh

$ /usr/bin/test --help
$
$ /usr/bin/[ --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.
[...]

Trong bashphiên bản dựng sẵn, sự khác biệt duy nhất là [yêu cầu ]ở cuối, như bạn đã nói.


1
Thật thú vị, mặc dù hầu hết các chương trình đều đạt được cùng một hành vi với một liên kết tượng trưng.
Kevin

1
Chúng là các liên kết cứng đến cùng một nút trên hệ thống của tôi. Lợi ích của việc này so với các liên kết tượng trưng là nếu mục tiêu liên kết tượng trưng bị xóa hoặc di chuyển, liên kết tượng trưng không còn hoạt động. Nếu một trong các liên kết cứng đến một nút được di chuyển hoặc loại bỏ, tất cả các liên kết cứng tiếp tục hoạt động.
Andrew Medico

5

Thông thường, chúng là cùng một nhị phân với các liên kết cứng. Tùy thuộc vào hệ vỏ, việc triển khai nội bộ có thể được sử dụng test[kiểm tra thay vì nhị phân. Điều này hiệu quả hơn về mặt sinh sản của quá trình và có thể cung cấp các tùy chọn khác với chương trình nhị phân testcung cấp.

Khác với sự khác biệt trong định dạng cuộc gọi, cả hai đều cung cấp cùng chức năng.


7
Thật đáng ngạc nhiên, trong lõi của Debian, chúng không phải là cùng một nhị phân. Cùng một nguồn được biên dịch hai lần, một lần xác định PROGRAM_NAME là "thử nghiệm" và một nguồn khác xác định nó là "[" và với một số mã bổ sung để kiểm tra biểu thức kết thúc bằng "]". o_O
angus

3
@angus Một ví dụ khác về điều này là ls / dir / vdir. Coreutils dường như thích xây dựng các nhị phân mã hóa khác nhau hơn là thử nghiệm argv [0] khi chạy.
Random832
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.