`test` и` [`- разные двоичные файлы, какая разница?


13

Я заметил, отвечая на другой вопрос , что testи [являются разными двоичными файлами, но [страница руководство тянет test«с. Помимо требования к финалу ], есть ли разница? Если нет, то почему они являются отдельными двоичными файлами вместо символьных ссылок? (Они также являются bashвстроенными и bashне показывают разницы).

Ответы:


4

Исходный код объясняет разницу в качестве того , как он обрабатывает --helpвариант.

  /* 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.  */

Демонстрируя

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

Во bashвстроенной версии единственное отличие состоит в том, что [требуется ]в конце, как вы сказали.


1
Интересно, что большинство программ достигают того же поведения с помощью символической ссылки.
Кевин

1
Это жесткие ссылки на один и тот же inode в моей системе. Преимущество этого перед символическими ссылками состоит в том, что, если цель символической ссылки удаляется или перемещается, символическая ссылка больше не работает. Если одна из жестких ссылок на инод перемещается или удаляется, все жесткие ссылки продолжают работать.
Эндрю Медико

5

Обычно это один и тот же двоичный файл с жесткими ссылками. В зависимости от оболочки может использоваться внутренняя реализация testи [тесты, а не двоичный файл. Это более эффективно с точки зрения порождения процесса и может предоставлять другие параметры, чем предоставляет бинарная программа test.

Помимо различий в формате вызовов, они оба предоставляют одинаковую функциональность.


7
Удивительно, но в coreutils Debian они не являются одинаковыми двоичными файлами. Один и тот же исходный код компилируется два раза: один определяет PROGRAM_NAME как «test», а другой - «[», и с некоторым дополнительным кодом для проверки того, что выражение заканчивается на «]». о_О
ангус

3
@angus Другой пример этого - ls / dir / vdir. Coreutils, похоже, предпочитает создавать разные жестко запрограммированные двоичные файлы, а не тестировать argv [0] во время выполнения.
Random832
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.