`test` и` [`- разные двоичные файлы, какая разница?
13
Я заметил, отвечая на другой вопрос , что testи [являются разными двоичными файлами, но [страница руководство тянет test«с. Помимо требования к финалу ], есть ли разница? Если нет, то почему они являются отдельными двоичными файлами вместо символьных ссылок? (Они также являются bashвстроенными и bashне показывают разницы).
Исходный код объясняет разницу в качестве того , как он обрабатывает --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
Это жесткие ссылки на один и тот же inode в моей системе. Преимущество этого перед символическими ссылками состоит в том, что, если цель символической ссылки удаляется или перемещается, символическая ссылка больше не работает. Если одна из жестких ссылок на инод перемещается или удаляется, все жесткие ссылки продолжают работать.
Эндрю Медико
5
Обычно это один и тот же двоичный файл с жесткими ссылками. В зависимости от оболочки может использоваться внутренняя реализация testи [тесты, а не двоичный файл. Это более эффективно с точки зрения порождения процесса и может предоставлять другие параметры, чем предоставляет бинарная программа test.
Помимо различий в формате вызовов, они оба предоставляют одинаковую функциональность.
Удивительно, но в coreutils Debian они не являются одинаковыми двоичными файлами. Один и тот же исходный код компилируется два раза: один определяет PROGRAM_NAME как «test», а другой - «[», и с некоторым дополнительным кодом для проверки того, что выражение заканчивается на «]». о_О
ангус
3
@angus Другой пример этого - ls / dir / vdir. Coreutils, похоже, предпочитает создавать разные жестко запрограммированные двоичные файлы, а не тестировать argv [0] во время выполнения.
Обычно это один и тот же двоичный файл с жесткими ссылками. В зависимости от оболочки может использоваться внутренняя реализация
test
и[
тесты, а не двоичный файл. Это более эффективно с точки зрения порождения процесса и может предоставлять другие параметры, чем предоставляет бинарная программаtest
.Помимо различий в формате вызовов, они оба предоставляют одинаковую функциональность.
источник