![¿Hay alguna razón para utilizar "[! -f archivo] || comando" en lugar de "[-f archivo] && comando"?](https://rvso.com/image/88490/%C2%BFHay%20alguna%20raz%C3%B3n%20para%20utilizar%20%22%5B!%20-f%20archivo%5D%20%7C%7C%20comando%22%20en%20lugar%20de%20%22%5B-f%20archivo%5D%20%26%26%20comando%22%3F.png)
encontré
[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
en /etc/default/lxc
Ubuntu 16.04 que parece estar reemplazando (mi propio código o el del mantenedor del paquete)
[ -f /etc/default/lxc-net ] && . /etc/default/lxc-net
Dado que la prueba es contraintuitiva (en caso de falla de la prueba por falta de presencia del archivo, ejecute el comando), me preguntaba si tiene alguna ventaja sobre la &&
versión.
Respuesta1
Sí, si te importa elcódigo de salida de la declaración compuesta. Pruebe lo siguiente:
#! /bin/sh -
! "$@" || true
echo "$?"
"$@" && true
echo "$?"
luego ejecútelo con true
y false
como argumentos.
./script true
0
0
./script false
0
1
Esto es porqueevaluación de cortocircuitode expresiones booleanas.
En el ejemplo de OP, supongamosel archivo no existe:
- En el primer caso, la primera condición devuelve VERDADERO, no es necesario evaluar la segunda operación (
TRUE OR x = TRUE
). Obtienes un VERDADERO para la declaración compuesta. - En el segundo caso, la primera condición devuelve FALSO, no es necesario evaluar la segunda operación (
FALSE AND x = FALSE
). Obtienes un FALSO para la declaración compuesta.
Los códigos de salida son muy importantes. Controlar¿Qué significa set -e en un script bash?para ver posibles implicaciones de set -e
, trap
y set -o pipefail
.
Respuesta2
[ -f file ]
es cierto cuando file
existeyes un plain file
.
[ ! -f file ]
es cierto cuando file
no existeoes otro tipo de archivo.
Así que no hay ninguna diferencia real, excepto la legibilidad.