Existe um motivo para usar "[! -f arquivo] || comando" em vez de "[ -f arquivo] && comando"?

Existe um motivo para usar "[! -f arquivo] || comando" em vez de "[ -f arquivo] && comando"?

eu encontrei

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

no /etc/default/lxcUbuntu 16.04 que parece estar substituindo (meu próprio código ou código do mantenedor do 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) fiquei pensando se ele tem alguma vantagem sobre a &&versão.

Responder1

Sim, se você se preocupa com ocódigo de saída da instrução composta. Experimente o seguinte:

#! /bin/sh -

! "$@" || true
echo "$?"

"$@" && true
echo "$?"

em seguida, execute-o com truee falsecomo argumentos.

./script true
0
0

./script false
0
1

Isto é porqueavaliação de curto-circuitode expressões booleanas.

No exemplo do OP, vamos suporo arquivo não existe:

  • No primeiro caso, a primeira condição retorna VERDADEIRO, não há necessidade de avaliar a segunda operação ( TRUE OR x = TRUE). Você obtém um TRUE para a instrução composta.
  • No segundo caso, a primeira condição retorna FALSO, não há necessidade de avaliar a segunda operação ( FALSE AND x = FALSE). Você obtém um FALSE para a instrução composta.

Os códigos de saída são muito importantes. VerificarO que set -e significa em um script bash?para ver possíveis implicações de set -e, trape set -o pipefail.

Responder2

[ -f file ]é verdade quando fileexisteeé um plain file.

[ ! -f file ]é verdade quando filenão existeoué outro tipo de arquivo.

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

informação relacionada