![Есть ли причина использовать «[ ! -f file ] || command» вместо «[ -f file ] && command»?](https://rvso.com/image/88490/%D0%95%D1%81%D1%82%D1%8C%20%D0%BB%D0%B8%20%D0%BF%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D0%B0%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%C2%AB%5B%20!%20-f%20file%20%5D%20%7C%7C%20command%C2%BB%20%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE%20%C2%AB%5B%20-f%20file%20%5D%20%26%26%20command%C2%BB%3F.png)
я нашел
[ ! -f /etc/default/lxc-net ] || . /etc/default/lxc-net
в /etc/default/lxc
Ubuntu 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
не существуетили— это еще один тип файла.
Так что никакой особой разницы нет, за исключением удобства чтения.