O que é o teste Linux - um teste de comando para?

3

Por favor, dê uma olhada no seguinte código,

snap=snapshot.file   
touch snapshot.file-1

$ [ -a $snap-1 ] && echo yes 
yes

O que o comando test -a testa aqui?

Eu tentei info coreutils 'test invocation' e procurei -a , mas não o encontrei na seção testes característicos de arquivo , mas na seção conectivos para teste .

Esse comando test -a é um não documentado ?

NB

  • Antes de pular para qualquer conclusão, por favor certifique-se de poder duplicar o resultado primeiro.
  • Meu sistema é Ubuntu 13.10 e meu man test diz GNU coreutils 8.20 outubro de 2012 TESTE (1) .
por xpt 17.06.2014 / 03:33

3 respostas

3

Não sei por que a página info não a possui, mas a execução de help test em bash fornece a resposta:

...
    File operators:

  -a FILE        True if file exists.
...

Portanto, é simplesmente um teste de "existência" e nenhuma outra permissão / atributo é verificada.

    
por 17.06.2014 / 03:42
3

Se você estiver executando test ou [ em bash , provavelmente é a versão incorporada, e não a coreutils versão em /usr/bin :

$ type test
test is a shell builtin
$ type [
[ is a shell builtin

Dito isso, parece que a versão coreutils implementa os dois -a e -e , exatamente com o mesmo comportamento. Talvez -a não seja refletido na página do manual porque não é o padrão , então talvez tenha sido adicionado mais tarde e essa pessoa esqueceu de atualizar a página do manual de acordo. Mas não posso dizer que conheço a história por trás da razão pela qual foi adicionado (ou até mesmo do que o a deve ser curto).

    
por 17.06.2014 / 07:17
1

-a é o operador AND para combinar condições, portanto, o seguinte mostra sim se ambos os diretórios existirem:

[ -e /root -a -e /usr ] && echo yes

O uso dele com uma única condição que padroniza um teste de existência parece ser um comportamento antigo, mas não consigo encontrá-lo nas páginas antigas.

Referência (role para baixo depois de info coreutils 'test invocation' ):

16.3.6 Connectives for 'test'

The usual logical connectives.

'! EXPR' True if EXPR is false.

'EXPR1 -a EXPR2' True if both EXPR1 and EXPR2 are true.

'EXPR1 -o EXPR2' True if either EXPR1 or EXPR2 is true.

    
por 17.06.2014 / 15:46