Existe uma razão para usar “[! -f arquivo] || comando ”em vez de“ [-f file] && command ”?

4

Eu encontrei

[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net

em /etc/default/lxc no Ubuntu 16.04 que parece estar substituindo (meu próprio código ou mantenedor de pacote)

[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net

Como o teste é contra-intuitivo (em caso de falha do teste sobre a não-presença do arquivo, execute o comando) Eu queria saber se ele tem alguma vantagem sobre o && -version.

    
por Karl Richter 17.05.2016 / 16:38

2 respostas

5

Sim, se você se importa com o código de saída da declaração composta . Tente o seguinte:

#/bin/sh

! $1 || true
echo $?

$1 && true
echo $?

execute-o com true e false como argumentos.

./script true
0
0

./script false
0
1

Isso ocorre porque avaliação de curto-circuito das expressões booleanas.

No exemplo do OP, vamos supor que o arquivo não exista :

  • No primeiro caso, a primeira condição retorna TRUE, não é necessário avaliar a segunda operação ( TRUE OR x = TRUE ). Você obtém uma VERDADEIRA para a declaração composta.
  • No segundo caso, a primeira condição retorna FALSE, não é necessário avaliar a segunda operação ( FALSE AND x = FALSE ). Você recebe um FALSE para a declaração composta.

Os códigos de saída são muito importantes. Verifique esta resposta SO para ver possíveis implicações de set -e , trap e set -o pipefail .

    
por 17.05.2016 / 17:03
0

[ -f file ] é verdadeiro quando file existe e é plain file .

[ ! -f file ] é verdadeiro quando file não existe ou é outro tipo de arquivo.

Portanto, não há diferença real - exceto pela legibilidade.

    
por 17.05.2016 / 17:16