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

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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.