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.)
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.
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.
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.
Normalmente, eles são os mesmos binários com links físicos. Dependendo do shell, uma implementação interna pode ser usada
test
e[
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áriotest
.Além das diferenças no formato da chamada, ambos oferecem a mesma funcionalidade.
fonte