`test` und` [`- verschiedene Binärdateien, irgendein Unterschied?

13

Ich bemerkte , während eine andere Frage zu beantworten , dass testund [andere Binärdateien sind, aber die [manpage zieht test‚s. Gibt es neben der Voraussetzung für ein Ende ]einen Unterschied? Wenn nicht, warum sind sie getrennte Binärdateien, anstatt miteinander verbunden zu sein? (Sie sind ebenfalls basheingebaut und bashzeigen auch keinen Unterschied.)

Kevin
quelle

Antworten:

4

Der Quellcode erklärt den Unterschied darin, wie er mit der --helpOption umgeht.

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

Demonstrieren

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

In der basheingebauten Version ist der einzige Unterschied, [der ]am Ende erforderlich ist , wie Sie sagten.

Mikel
quelle
1
Interessant, obwohl die meisten Programme mit einem Symlink dasselbe Verhalten erzielen.
Kevin
1
Sie sind Hardlinks zu derselben Inode auf meinem System. Dies hat gegenüber Symlinks den Vorteil, dass der Symlink nicht mehr funktioniert, wenn das Symlink-Ziel entfernt oder verschoben wird. Wenn einer der Hardlinks zu einer Inode verschoben oder entfernt wird, funktionieren alle Hardlinks weiterhin.
Andrew Medico
5

Normalerweise sind sie die gleichen Binärdateien mit festen Links. Abhängig von der Shell kann eine interne Implementierung für testund [tests anstelle der Binärdatei verwendet werden. Dies ist effizienter in Bezug auf das Prozess-Laichen und bietet möglicherweise andere Optionen als das Binärprogramm test.

Abgesehen von den Unterschieden im Anrufformat bieten beide dieselbe Funktionalität.

BillThor
quelle
7
Erstaunlicherweise sind sie in Debians Coreutils nicht die gleichen Binärdateien. Dieselbe Quelle wird zweimal kompiliert, wobei die eine PROGRAM_NAME als "test" und die andere als "[" definiert und mit zusätzlichem Code überprüft, ob der Ausdruck mit "]" endet. o_O
angus
3
@angus Ein weiteres Beispiel hierfür ist ls / dir / vdir. Coreutils scheint es zu mögen, verschiedene fest codierte Binärdateien zu erstellen, anstatt zur Laufzeit argv [0] zu testen.
Random832