`test` i` [`- różne pliki binarne, jakaś różnica?

13

Zauważyłem, odpowiadając na inne pytanie, testi [są to różne pliki binarne, ale strona [podręcznika się wyświetla test. Czy oprócz wymogu zakończenia ]jest jakaś różnica? Jeśli nie, to dlaczego oddzielają pliki binarne zamiast być dowiązaniami symbolicznymi? (Są również bashwbudowane i bashnie wykazują żadnej różnicy).

Kevin
źródło

Odpowiedzi:

4

Kod źródłowy wyjaśnia różnicę jako jak to obsługuje --helpopcję.

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

Demonstracja

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

W bashwersji wbudowanej jedyną różnicą jest to, że [wymaga ]na końcu, jak powiedziałeś.

Mikel
źródło
1
Interesujące, chociaż większość programów osiąga takie samo zachowanie dzięki dowiązaniu symbolicznemu.
Kevin
1
Są twardymi linkami do tego samego i-węzła w moim systemie. Zaletą tego w porównaniu z dowiązaniami symbolicznymi jest to, że jeśli cel dowiązania symbolicznego zostanie usunięty lub przeniesiony, dowiązanie symboliczne już nie działa. Jeśli jedno z twardych łączy do i-węzła zostanie przeniesione lub usunięte, wszystkie twarde łącza będą nadal działać.
nikt
5

Zwykle są to te same pliki binarne z twardymi linkami. W zależności od powłoki można zastosować wewnętrzną implementację testi [testy zamiast pliku binarnego. Jest to bardziej wydajne pod względem odradzania procesów i może zapewniać inne opcje niż program binarny test.

Poza różnicami w formacie połączenia oba zapewniają tę samą funkcjonalność.

BillThor
źródło
7
O dziwo, w jądrach Debiana nie są to te same pliki binarne. To samo źródło jest kompilowane dwa razy, jeden definiuje PROGRAM_NAME jako „test”, a drugi definiuje go jako „[” oraz z dodatkowym kodem do sprawdzenia, czy wyrażenie kończy się na „]”. o_O
angus
3
@angus Innym przykładem tego jest ls / dir / vdir. Wydaje się, że Coreutils lubi budować różne pliki binarne na stałe, zamiast testować argv [0] w czasie wykonywania.
Random832