O que "EXPRESSÃO], [] e [OPÇÃO` significam no` teste do homem`?

8

Examinando man test, vejo que em sinopse testestão as possibilidades test EXPRESSIONe test.

O que [ EXPRESSION ], [ ] and [OPTIONsignifica abaixo?

Por que os colchetes estão vazios e por que [OPTIONfalta um colchete? Alguém pode interpretar isso para mim?

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION
Shuzheng
fonte

Respostas:

10

[é outro nome para test. Todas as três linhas são linhas de comando que são executadas testcom algumas opções.

Na primeira linha, este é o teste padrão: [ 5 -gt 4 ]é o mesmo que test 5 -gt 4.

No segundo, a expressão é omitida, o que significa sair de false ( 0 arguments: Exit false (1)).

Para o terceiro caso, você está usando o GNU coreutils. No GNU, testo texto de ajuda contém esta nota:

NOTE: [ honors the --help and --version options, but test does not.
test treats each of those as it treats any other nonempty STRING.

Esta é uma extensão não POSIX ; a motivação parece ser a testnecessária para tratar esses argumentos como seqüências de caracteres como qualquer outra. [é capaz de distinguir o caso opcional do caso de cadeia pela presença do ]colchete de fechamento .

Observe que seu shell provavelmente fornecerá o seu próprio [e, portanto, você precisará /bin/\[usar esta versão.

Michael Homer
fonte
4

[é o mesmo que testuma concha embutida em algumas conchas.

Se você olhar mais para baixo man test, descreve quais são os válidos com os quais EXPRESSIONvocê pode testar:

Uma EXPRESSÃO omitida assume como padrão false. Caso contrário, EXPRESSION é verdadeiro ou falso e define o status de saída. É um dos seguintes: ...

Isto pode não ser aparente para você desde o homem páginas, mas em mais velhas / algumas outras conchas, tanto [e testestão disponíveis como comandos reais, o que significa que o espaço que você vê nos [ EXPRESSION ]é obrigatória para EXPRESSIONser aceito como um argumento para o [/ test. Assim, mesmo para os shells que os oferecem como embutidos, eles mantêm esse formato para compatibilidade.

E, como explicado na resposta de @ dr01 , enquanto digito isso, o colchete direito é opcional.

hjk
fonte
@don_crissti graças para o heads-up, acho que vou simplesmente omitir essa última frase ...
HJK
0

[ OPTION realmente não está faltando um suporte.

De fato, talvez surpreendentemente, [é um comando (localizado em /usr/bin/[) equivalente a test. Portanto, foi permitido (pelo menos teoricamente) usar apenas o colchete esquerdo, com o colchete direito servindo apenas como açúcar sintático. No entanto, versões mais recentes do shell exigem isso .

dr_
fonte
Existem outras diferenças entre elas que testnão podem ser usadas com uma opção (não listadas com essa possibilidade).
Shuzheng
1
É não permitido omitir o suporte direito, quer no POSIX ou GNU [.
Michael Homer
@MichaelHomer Sim. Corrigido.
dr_
Eu não tenho certeza do que Bash tem a ver com isso ...
Michael Homer
1
@MichaelHomer, no POSIX, o comportamento se você omitir o colchete certo não é especificado, portanto, um script POSIX não pode omitir o ], mas um POSIX [pode fazer o que deseja, incluindo chamar nomes e reinicializar a máquina ou imprimir uma mensagem de ajuda se você chamar sem ele. Isso permite o GNU grep's [ --version. test --versione, [ --version ]no entanto, é necessário retornar true (teste por --versionser a sequência não vazia) e não produzir nada.
Stéphane Chazelas