`test` і` [`- різні бінарні файли, будь-яка різниця?


14

Я помітив, відповідаючи на ще одне питання, що є testі [різними бінарними файлами, але сторінка [підтягує test. Окрім вимоги про закінчення ], чи є різниця? Якщо ні, то чому вони відокремлюють двійкові файли, а не пов'язують їх між собою (Вони також є bashвбудованими, і bashрізниці також не виявляються.)

Відповіді:


6

Вихідний код пояснює різницю в якості того , як він обробляє --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
Цікаво, хоча більшість програм досягають такої ж поведінки за допомогою симпосилання.
Кевін

2
Вони є жорсткими посиланнями на один і той же код у моїй системі. Перевага цього над посиланнями полягає в тому, що якщо ціль символьного посилання буде видалена або переміщена, симпосилання більше не працює. Якщо один із жорстких посилань на індез переміщується чи видаляється, всі жорсткі посилання продовжують працювати.
ніхто

6

Зазвичай вони однакові бінарні з жорсткими посиланнями. В залежності від оболонки, внутрішня реалізація може бути використана для testі [випробувань , а не бінарного файлу. Це більш ефективно з точки зору нересту процесів і може надавати різні варіанти, ніж двійкова програма test.

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


8
Дивно, але в ядрах Debian вони не є тим самим бінарним. Це одне і те ж джерело складається два рази, один визначає PROGRAM_NAME як "тест", а інший визначає його як "[" і з деяким додатковим кодом, щоб перевірити, що вираз закінчується на "]". o_O
angus

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