Как в BASH работают логические операторы?

Представим простую последовательность команд
cd ~/dir1 && cd ~/dir2 && echo "Success" || echo "Failed"

Если dir1 и dir2 существуют в домашней директории пользователя, то каждая команда (cd) вернёт True, и в результате выполнится echo "Success"
1 && 1 && echo "Success"
Если хоть одной директории нет, то в левой части получится 0 и логический оператор "Или" направит последовательность к выводу слова Failed
1 && 0 || echo "Failed"

Однако, возникает вопрос - а как именно BASH преобразовывает результат выполнения определённой команды в булевое значение? Куда он это значение записывает, и где хранит? Как можно это значение вывести?
На код ошибки это не похоже. Так как успешное выполнение команды возвращает 0. Что полностью противоречит алгебре логики.

За счёт чего и как в BASH реализован механизм взаимодействия команд с логическими операторами?
  • Вопрос задан
  • 1902 просмотра
Решения вопроса 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Как всегда, в заголовке "Как в работают логические операторы?", а на самом деле вопрос "почему код ошибки 0 интерпретируется как true". "Где логика, где разум?" :)

В то время как озвученный вопрос и на самом деле интересный.
Так работают логические операторы не только в баше. В РНР точно так же можно написать
true /*false*/ and print "Success" or print "Failed";
и получать тот же самый результат.
Суть тут в том, что логические операторы делаются "ленивыми". Они не вычисляют тот операнд, который не влияет на конечный результат.
Соответственно:
  • если операция вернула true, то мы должны выполнить тот операнд, который стоит после and, потому что иначе не сможем получить общий результат операции and. который будет true только если оба операнда вернули true
  • если операция вернула true, то нет смысла выполнять тот операнд, который стоит после or, поскольку его результат ни на что не повлияет - итоговый результат в любом случае будет true, поскольку для or важно чтобы истинным был только один результат. получаем "Success"
  • если операция вернула false, то нам не нужно выполнять тот операнд, который стоит после and, потому что в любом случае результатом будет false
  • если операция вернула false, то мы должны выполнить тот операнд, который стоит после or, поскольку он будет определяющим для всего выражения. получаем "Failed"
Ответ написан
Комментировать
Выполнение команды возвращает статус-код: 0 если всё ок, или больше, если какая-то ошибка.

Статус ещё попадает в специальную переменную $?
> cd non-existing
-bash: cd: non-existing: No such file or directory

> echo $?
1

> cd ~
> echo $?
0
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Однако, возникает вопрос - а как именно BASH преобразовывает результат выполнения определённой команды в булевое значение?

Он это не делает. Он проверяет код возврата команды, который согласно архитектуре линукс - может иметь значение от 0 до 255 (байт)
Просто значение 0 считается true, любое другое значение считается false

На код ошибки это не похоже. Так как успешное выполнение команды возвращает 0. Что полностью противоречит алгебре логики.

С чего это вдруг противоречит? Противоречит только в том случае, если вы не читали документацию.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Так как успешное выполнение команды возвращает 0. Что полностью противоречит алгебре логики.

Потому что вы зачем-то отождествляете код статуса с булевой переменной, а это неправильно - он может принимать различные значения.

Всё это легко гуглится, короче.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы