`test` e` [`- binários diferentes, alguma diferença?

13

Notei ao responder a outra pergunta que teste [são binários diferentes, mas a página de [manual aparece test. Além da exigência de um final ], existe alguma diferença? Caso contrário, por que eles são binários separados em vez de vinculados? (Eles também são bashembutidos e bashtambém não mostram diferença.)

Kevin
fonte

Respostas:

4

O código fonte explica a diferença como é como ele lida com a --helpopção.

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

Demonstrando

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

Na bashversão embutida, a única diferença é que [requer ]no final, como você disse.

Mikel
fonte
1
Interessante, embora a maioria dos programas atinja o mesmo comportamento com um link simbólico.
22412 Kevin
1
Eles são hardlinks para o mesmo inode no meu sistema. O benefício disso em relação aos links simbólicos é que, se o destino do link simbólico for removido ou movido, o link simbólico não funcionará mais. Se um dos hardlinks para um inode for movido ou removido, todos os hardlinks continuarão funcionando.
Andrew Medico
5

Normalmente, eles são os mesmos binários com links físicos. Dependendo do shell, uma implementação interna pode ser usada teste [testada em vez do binário. Isso é mais eficiente em termos de geração de processos e pode fornecer opções diferentes das fornecidas pelo programa binário test.

Além das diferenças no formato da chamada, ambos oferecem a mesma funcionalidade.

BillThor
fonte
7
Surpreendentemente, nos coreutils do Debian eles não são o mesmo binário. A mesma fonte é compilada duas vezes, uma definindo PROGRAM_NAME como "teste" e outra definindo-a como "[" e com algum código adicional para testar se a expressão termina com "]". o_O
angus
3
@angus Outro exemplo disso é ls / dir / vdir. Coreutils parece gostar de construir binários codificados diferentes ao invés de testar argv [0] em tempo de execução.
usar o seguinte comando