`test` et` [`- différents binaires, une différence?

13

J'ai remarqué en répondant à une autre question que testet [sont des binaires différents, mais la [page de manuel tire vers testle haut . Outre l'exigence d'une fin ], y a-t-il une différence? Sinon, pourquoi sont-ils des binaires séparés au lieu d'être liés par des liens symboliques? (Ils sont également bashintégrés et bashne montrent pas non plus de différence.)

Kevin
la source

Réponses:

4

Le code source explique la différence comme étant la façon dont il gère l' --helpoption.

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

Démonstration

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

Dans la bashversion intégrée, la seule différence est que cela [nécessite ]à la fin, comme vous l'avez dit.

Mikel
la source
1
Intéressant, bien que la plupart des programmes obtiennent le même comportement avec un lien symbolique.
Kevin
1
Ce sont des liens physiques vers le même inode sur mon système. L'avantage de ceci sur les liens symboliques est que si la cible du lien symbolique est supprimée ou déplacée, le lien symbolique ne fonctionne plus. Si l'un des liens durs vers un inode est déplacé ou supprimé, tous les liens durs continuent de fonctionner.
Andrew Medico
5

Normalement, ce sont les mêmes binaires avec des liens durs. Selon le shell, une implémentation interne peut être utilisée pour testet des [tests plutôt que le binaire. Ceci est plus efficace en termes de génération de processus et peut fournir des options différentes de celles testfournies par le programme binaire .

Outre les différences de format d'appel, elles offrent toutes deux la même fonctionnalité.

BillThor
la source
7
Étonnamment, dans les coreutils de Debian, ils ne sont pas les mêmes binaires. La même source est compilée deux fois, l'une définissant PROGRAM_NAME comme "test" et l'autre la définissant comme "[" et avec du code supplémentaire pour tester que l'expression se termine par "]". o_O
angus
3
@angus Un autre exemple de ceci est ls / dir / vdir. Coreutils semble aimer construire différents binaires codés en dur plutôt que de tester argv [0] au moment de l'exécution.
Random832