![Existe um motivo para usar "[! -f arquivo] || comando" em vez de "[ -f arquivo] && comando"?](https://rvso.com/image/88490/Existe%20um%20motivo%20para%20usar%20%22%5B!%20-f%20arquivo%5D%20%7C%7C%20comando%22%20em%20vez%20de%20%22%5B%20-f%20arquivo%5D%20%26%26%20comando%22%3F.png)
eu encontrei
[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
no /etc/default/lxc
Ubuntu 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 true
e false
como 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
, trap
e set -o pipefail
.
Responder2
[ -f file ]
é verdade quando file
existeeé um plain file
.
[ ! -f file ]
é verdade quando file
não existeoué outro tipo de arquivo.
Portanto, não há diferença real - exceto na legibilidade.