В рыбе true кажется равным 0:
❯ if true == 0; echo "YES"; else; echo "NO"; end
YES
Но false похоже не равно 1:
❯ if false == 1; echo "YES"; else; echo "NO"; end
NO
В bash оба они не эквивалентны своему числовому значению:
$ if [ true == 0 ]; then echo "YES"; else echo "NO"; fi
NO
$ if [ false == 1 ]; then echo "YES"; else echo "NO"; fi
NO
Кажется странным, что рыба будет считать одно значение истинности равным своему числовому эквиваленту, но не другое.
Может, этому есть объяснение?
Вы передаете аргументы == и 0/1 командам true/false... это не оболочка читает их (я имею в виду, технически это так, потому что это встроенные функции, но я имею в виду, что не та часть, которая будет обрабатывать реальный синтаксис оболочки ). Таким образом, здесь у вас нет сравнения, кроме того, что делает if, то есть «проверьте, имеет ли результат следующей команды нулевой код выхода». Это потому, что в вашем примере с рыбой вы не использовали команду [, которую использовали в Bash.
@KamilCuk Да, true и false - это строки, но они также являются именами (встроенных) команд. Команды можно использовать напрямую (не в [...]) как условия: ok=true ; if $ok ; then echo OK ; else echo 'Huh?' ; fi
Команда true игнорирует аргументы и завершается с нулевым статусом выхода, что означает успех.
if true you can put literally anything here; echo "YES"; else; echo "NO"; end
Команда false игнорирует аргументы и завершается с ненулевым статусом выхода, что означает сбой.
if false you can put literally anything here too; echo "YES"; else; echo "NO"; end
Эквивалентный код Bash:
if true anything here; then echo "YES"; else echo "NO"; fi
if false anything here too; then echo "YES"; else echo "NO"; fi
Команда [ true == 0 ] выполняет команду [ и сравнивает строку true со строкой 0. Поскольку true и 0 — разные строки, сравнение (логически) ложно, поэтому команда [ завершается с ненулевым статусом выхода. Аналогично с false == 0. Обратите внимание, что == является расширением [ — это [ true = 0 ] в стандартном [.
Вы можете сравнить, что в Fish команда [ также «обе они не эквивалентны их числовому значению»:
if [ true == 0 ]; echo "YES"; else; echo "NO"; end
if [ false == 1 ]; echo "YES"; else; echo "NO"; end
Когда-то (версия 2.7) встроенные функции fish true и false вызывали ошибку, если вы вводили им какие-либо аргументы. Теперь (версия 3.5) он их просто молча игнорирует. (И ни в одной из версий не задокументировано упоминание аргументов.) Я предполагаю, что это попытка быть более совместимым с POSIX?
«Я предполагаю, что он пытается быть более совместимым с POSIX» — больше похоже на то, что он меняется, чтобы соответствовать ожиданиям пользователей.
In bash both of them are not equivalent to their numeric value:
?? В Bash строка true и строка false — это просто строка.