Есть ли причина использовать «[ ! -f file ] || command» вместо «[ -f file ] && command»?

Есть ли причина использовать «[ ! -f file ] || command» вместо «[ -f file ] && command»?

я нашел

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

в /etc/default/lxcUbuntu 16.04, который, похоже, заменяет (мой собственный код или код сопровождающего пакета)

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

Поскольку тест нелогичен (в случае провала теста из-за отсутствия файла выполнить команду), мне стало интересно, есть ли у него какие-либо преимущества перед -версией &&.

решение1

Да, если вас это волнуеткод выхода составного оператора. Попробуйте следующее:

#! /bin/sh -

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

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

затем запустите его с аргументами trueи .false

./script true
0
0

./script false
0
1

Это потому чтооценка короткого замыканиябулевых выражений.

В примере OP предположим, чтофайл не существует:

  • В первом случае первое условие возвращает ИСТИНА, нет необходимости оценивать вторую операцию ( TRUE OR x = TRUE). Вы получаете ИСТИНА для составного оператора.
  • Во втором случае первое условие возвращает ЛОЖЬ, нет необходимости оценивать вторую операцию ( FALSE AND x = FALSE). Вы получаете ЛОЖЬ для составного оператора.

Коды выхода очень важны. ПроверитьЧто означает set -e в скрипте bash?чтобы увидеть возможные последствия set -e, trapи set -o pipefail.

решение2

[ -f file ]верно, когда fileсуществуетиэто plain file.

[ ! -f file ]верно, когда fileне существуетили— это еще один тип файла.

Так что никакой особой разницы нет, за исключением удобства чтения.

Связанный контент