Qual é o significado desta expressão de teste?

1

Eu tenho lido as man pages para test (1), bash (1) e dash (1), mas não consigo descobrir o significado desse teste:

[ 'echo hi' > /dev/null ]

De acordo com as páginas man, existem dois tipos de expressões condicionais, primária e combinada. Expressões combinadas são expressões combinadas de primárias.

Eu passei pela lista de primárias e nenhuma corresponde à sintaxe da expressão acima. Alguém pode quebrar isso para mim?

    
por gpo 05.04.2013 / 00:25

2 respostas

3

Isso é o mesmo que:

[ 'echo hi' ] > /dev/null
Os redirecionamentos

podem aparecer em qualquer lugar na linha.

Em condições normais, é o mesmo que

[ hi ]

Qual é o mesmo que:

true

Esse é um comando que não produz nada e retorna um status de saída bem-sucedido.

O resultado pode ser diferente se:

  • o redirecionamento falha, por exemplo, se você atingiu o limite de arquivos abertos ou não tem acesso de gravação a /dev/null (o que novamente não deve acontecer em condições normais). Nesse caso, o shell retornará com um status de saída diferente de zero e você verá uma mensagem de erro, e o comando [ não será executado.
  • A substituição do comando falha (por exemplo, porque você não pode desembolsar mais nenhum processo ou não pode iniciar um canal porque atingiu o número máximo de descritores de arquivo). Nesse caso, dependendo do shell, muitas coisas podem acontecer, incluindo o abortamento do shell.
  • se $IFS contiver h ou i , então isso será resolvido para (por exemplo, para IFS = h): [ '' i ] , que é inválido e fará com que [ retorne um erro e defina o status de saída para o não sucesso.
  • coisas possivelmente mais estranhas se [ ou echo tiverem sido redefinidas para fazer outra coisa, como tocar uma música ou reiniciar o computador.

Em suma, esse comando não faz sentido e provavelmente foi escrito com a intenção exclusiva de confundir você.

    
por 05.04.2013 / 12:18
5

OK. Eu sou um novato bash, mas: Embora sua pergunta seja clara, eu não estou completamente Certifique-se que eu recebo o que você pede. Isso talvez seja uma surpresa. Por favor, diga se sim.

TEST IF "echo hi > /dev/null" is success

[ 'echo hi' > /dev/null ]
| |   |   | |           |
| |   |   | |           +--- Last test argument
| |   |   | +--------------- Redirect standard out to /dev/null
| |   |   +----------------- Backtick - End Command Substitution
| |   +--------------------- echo hi
| +------------------------- Backtick - Start Command Substitution
+--------------------------- Test

Se o eco ou o redirecionamento falhar, o teste falhará, caso contrário, o sucesso.

Quando um comando é executado, ele possui um código de saída que significa sucesso, 0 , ou erro <> 0 . Assim, se falhar, tudo falhará.

O padrão "[ ... ]" não é como em if (foo == bar) , mas [ é realmente um comando que exige ] como último argumento.

Isso também esclarece por que alguém precisa de espaço antes e antes de [ e ] .

por 05.04.2013 / 01:27

Tags