Existe alguma diferença significativa entre 'if [-a FILE]' e 'if [-e FILE]'?

4

Eu só quero fazer check-in se houver um determinado FILE.
Em esta página , duas opções são mencionadas para uso com if :

  • [ -a FILE ] - Verdadeiro se existir FILE
  • [ -e FILE ] - Verdadeiro se existir FILE

Eles são equivalentes ou há alguma diferença entre eles?

    
por derHugo 05.09.2017 / 12:31

1 resposta

2

O que você faz e por que existe?

A opção -a é a mesma coisa que -e e existe para compatibilidade com o Korn Shell do qual o Bash emprestou muitos recursos.

Do padrão POSIX, descrição do comando test ( link ):

  

Uma proposta inicial usava o KornShell -a primário (com o mesmo significado), mas isso foi alterado para -e porque havia preocupações sobre a alta probabilidade de humanos confundirem o -a primário com o -a operador binário.

nota lateral : binary significa sinalizador que aparece entre duas variáveis [ $var1 -a $var2 ] , principal significa aparecer na lista de argumentos primeiro como em [ -a $var ]

Na verdade, o manual Korn Shell ( ksh93 here) afirma:

  

-a arquivo

     

O mesmo que -e abaixo. Isso é obsoleto.

O comando test usado no artigo do TLDP que você referenciou usa bash built-in test , no entanto, a opção também está presente em /usr/bin/test , apesar de estar ausente da documentação:

$ /usr/bin/test -a /etc/passwd  && echo 1                                   
1

Se a funcionalidade é a mesma, é recomendável usá-la?

Desde que você tenha 100% de certeza de que seus scripts serão usados no Bash ou no Korn Shell - então sim, tudo bem. No entanto, se você se esforçar para a portabilidade de seus scripts e quiser escrever o script Right Way TM , deverá usar -e . O shell padrão do Ubuntu, /bin/sh , que na verdade é Dash - o Debian Amquist Shell - não reconhece essa opção como válida:

$ dash
$ test -a /etc/passwd
dash: 1: test: -a: unexpected operator

Nos casos em que você deseja portar seu script para outras plataformas, não é garantido que usar -a também seja seguro com /usr/bin/test , e você deve ficar com -e porque é de fato especificado pelo padrão POSIX .

    
por Sergiy Kolodyazhnyy 28.10.2017 / 18:29

Tags