`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).

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ś.


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ść.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.