Труъ Bash
Each command executes in turn, provided that the previous command has given a return value of true (zero). At the first false (non-zero) return, the command chain terminates (the first command returning false is the last one to execute).
Цитата из «Advanced Bash-Scripting Guide». Всё-таки пусть bash умрёт.
Добавлено чуть позже: ладно, я чуть-чуть троллю. Я хочу смерти всех классических шелов. Но не немедленной, разумеется.
А что не так?
Комментарий для maxim-zotov.livejournal.com:
0 — True
!0 — False
Всё так? :)
Так это с допотопных времен. И с bash вообще не связано, это протокол исполнения программ, так даже в msdos: все программы возвращают 0 в случае успеха или код ошибки в случае ошибки. Успех всегда одинаков, а вот ошибки могут быть очень разными, поэтому для успеха нужно выделенное единственное значение «0».
И в bat-файлах те же конструкции можно использовать:
http://www.rsdn.ru/article/winshell/batanyca.xml#EHBAE
ээээ... ну так exit code 0 — это все гут, не 0 — все плохо. Выполнять цепочку команд пока все
Комментарий для maxim-zotov.livejournal.com:
Ну это не повод считать, что 0 это true :)
Комментарий для deniszh2.ya.ru:
Совершенно нелогично, что «A && B» должно выполнить «B», если «A» вернуло ноль, не так ли?
что-то я тоже не догоняю — хде «ржать»-то?
Комментарий для Евгения Степанищева:
true оно называется для того, чтобы логические выражения типа «A && B» оперировали обычными для них понятиями «true» и «false». Ведь именно такими значениями оперируют логические выражения. Да, более точный смысл — «success» и «fail», но какая разница?
Комментарий для borzdeg.blogspot.com:
Второй коммент.
Комментарий для maxim-zotov.livejournal.com:
Да, Капитан :) Вот именно это и нелогично.
Комментарий для Евгения Степанищева:
Ну тогда уже не «пусть bash умрет», а пусть авторы «Advanced Bash-Scripting Guide» умрут. :)
bash как раз тут ведет себя абсолютно логично — его авторы не писали что «zero» это «true»...
да, я вот не могу аргументированно ничего сказать и мне вообще все равно, но уберите руки от баша! :D
Комментарий для deniszh2.ya.ru:
Тем не менее, по операциям «&&» и «||» получается, что «0» это «true»
Комментарий для hshhhhh.name:
Да ну, херовый же шел. Он жив потому, что везде есть и на нём многое принято писать.
А какой — хороший? lisp?
Разве exit-коды от шелла зависят?
(Что-то по OpenID как lxj.endofinternet.net зайти не могу, говорит Fatal error: Cannot redeclare class hKit in /home/bolk/domains/bolknote.ru/public_html/_blok/hkit.inc.php on line 72)
что-то мне подсказывает, что если сменить шелл, то программы не перестанут 0 возвращать в качестве успеха. (-:
Ну и вообще согласен с предыдущими ораторами — не должен баш отвечать за ляпы или спорные моменты в авторов Advanced Scripting Guide
Успех — один. Ошибки разные. Вот если по уму говорить, то куда бы ты порекомендовал определить ноль, а куда остальные цифры?
Комментарий для jankkhvej.blogspot.com:
Например, PowerShell. zsh хорош.
Комментарий для gaius-julius.livejournal.com:
Это правда :) Я немного троллю :)
Комментарий для astur.net.ru:
Современный шел вообще таким заморачиваться не должен. Исключения и их обработка.
Комментарий для LXj:
Я немного троллю, да. Но вообще exit-коды это пережиток прошлого.
Oops… А если сейчас попробовать?
Сам баш можно убить вот за что:
Это как-бы тонкая полуправда на границе с ложью.
Например, такая команда завершится без ошибки и выполнение продолжится
cat non-existent-file | grep -v ’bad’ > result
P.S. мечтаю юзать PowerShell в *nix.
P.P.S. Гробить написанный коммент, если юзер забыл написать openId — невежливо.
Комментарий для sad-wind.ya.ru:
А я и не гроблю. Разве что ошибка какая-то могла случится. Можно подробнее симптомы?
Комментарий для Евгения Степанищева:
FF4
Отправляю комментарий я незаполненным именем.
Получаю назад пустую форму и «Ошибка: Введите адрес вашего сайта или блога»
Комментарий для sad-wind.ya.ru:
Во-первых, ход мысли верный, но пример неудачный, потому что grep в этом случае как раз будет возращать ошибку, поэтому результат pipeline будет ошибочным, но не из-за несуществующего файла, а из-за того, что греп не нашел заданных строк.
Правильный пример:
cat non-existent-file | true || echo FAILED
Но после магической строки
set -o pipefail
этот пример работает логично, выдает FAILED.
Во-вторых, речь идет о «command chain»: конструкции типа «cmd1 && cmd2 && cmd3», а не о pipes. Для pipes — да, результат pipeline — результат последней в pipe команды. Еще раз, это поведение исправляется командой «set -o pipefail», в этом случае «УСПЕХ» pipeline будет только в случае если все команды вернули УСПЕХ. Но, видимо, там есть какие-то подводные камни, раз не сделали такое поведение поведением по умолчанию.
Комментарий для sad-wind.ya.ru:
Ох, mea culpa. Буду править.
Сделайте в PHP
<?php
$a = false;
$a++;
var_dump($a);
<?php
$a = false;
a += 1;
var_dump($a);
И подумайте, кого ещё надо уничтожить? 8-)
Комментарий для jankkhvej.blogspot.com:
<?php
$a = false;
$a += 1;
var_dump($a);
конечно же
Комментарий для jankkhvej.blogspot.com:
Ну, тоже не удивили. Попробуйте ещё:
$a = null;
$a--;
$a++;
var_dump($a);
Это известное исключение (ну, известное тем, кто руководство по языку хоть раз читал, конечно). В PHP сюрпризов много, кто бы спорил. Но у bash сейчас вообще достоинств нет, кроме распространённости.
Комментарий для Евгения Степанищева:
Ну дык и про exit status и ||, && в баше то же ж известно.
Единственный язык, который не «должен умереть» — Pascal. Хотя я отдаю себе отчёт что это у меня детская любовь.
Комментарий для jankkhvej.blogspot.com:
А Pascal чем плох, кроме многословности? Java, вон, куда более многословна.
Комментарий для Евгения Степанищева:
Паскаль хорош, о чём я и говорю.
Комментарий для jankkhvej.blogspot.com:
Oberon-2 — лучше.
Комментарий для Евгения Степанищева:
Да, но к тому времени я уже любил Pascal.