¿Hay alguna razón para utilizar "[! -f archivo] || comando" en lugar de "[-f archivo] && comando"?

¿Hay alguna razón para utilizar "[! -f archivo] || comando" en lugar de "[-f archivo] && comando"?

encontré

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

en /etc/default/lxcUbuntu 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 truey falsecomo 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, trapy set -o pipefail.

Respuesta2

[ -f file ]es cierto cuando fileexisteyes un plain file.

[ ! -f file ]es cierto cuando fileno existeoes otro tipo de archivo.

Así que no hay ninguna diferencia real, excepto la legibilidad.

información relacionada