Труъ 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 умрёт.

Добавлено чуть позже: ладно, я чуть-чуть троллю. Я хочу смерти всех классических шелов. Но не немедленной, разумеется.

Комментарии 35

maxim-zotov (maxim-zotov.livejournal.com) № 3
Так это с допотопных времен. И с bash вообще не связано, это протокол исполнения программ, так даже в msdos: все программы возвращают 0 в случае успеха или код ошибки в случае ошибки. Успех всегда одинаков, а вот ошибки могут быть очень разными, поэтому для успеха нужно выделенное единственное значение «0».

И в bat-файлах те же конструкции можно использовать:
http://www.rsdn.ru/article/winshell/batanyca.xml#EHBAE
deniszh (deniszh2.ya.ru) № 4
ээээ… ну так exit code 0 — это все гут, не 0 — все плохо. Выполнять цепочку команд пока все
Евгений Степанищев (bolknote.ru) автор № 6
ээээ… ну так exit code 0 — это все гут, не 0 — все плохо. Выполнять цепочку команд пока все

Совершенно нелогично, что «A && B» должно выполнить «B», если «A» вернуло ноль, не так ли?

Евгений Степанищев (bolknote.ru) автор № 5
Комментарий для maxim-zotov.livejournal.com:

Ну это не повод считать, что 0 это true :)
maxim-zotov (maxim-zotov.livejournal.com) № 8

Комментарий для Евгения Степанищева:

Ну это не повод считать, что 0 это true :)

true оно называется для того, чтобы логические выражения типа «A && B» оперировали обычными для них понятиями «true» и «false». Ведь именно такими значениями оперируют логические выражения. Да, более точный смысл — «success» и «fail», но какая разница?

Евгений Степанищев (bolknote.ru) автор № 10

Комментарий для maxim-zotov.livejournal.com:

true оно называется для того, чтобы логические выражения типа «A && B» оперировали обычными для них понятиями «true» и «false». Ведь именно такими значениями оперируют логические выражения. Да, более точный смысл — «success» и «fail», но какая разница?

Да, Капитан :) Вот именно это и нелогично.

deniszh (deniszh2.ya.ru) № 11
Комментарий для Евгения Степанищева:

Ну тогда уже не «пусть bash умрет», а пусть авторы «Advanced Bash-Scripting Guide» умрут. :)
bash как раз тут ведет себя абсолютно логично — его авторы не писали что «zero» это «true»…
hshhhhh.name № 12
да, я вот не могу аргументированно ничего сказать и мне вообще все равно, но уберите руки от баша! :D
Евгений Степанищев (bolknote.ru) автор № 14
да, я вот не могу аргументированно ничего сказать и мне вообще все равно, но уберите руки от баша! :D

Да ну, херовый же шел. Он жив потому, что везде есть и на нём многое принято писать.

Евгений Степанищев (bolknote.ru) автор № 13

Комментарий для deniszh2.ya.ru:

bash как раз тут ведет себя абсолютно логично — его авторы не писали что «zero» это «true»…

Тем не менее, по операциям «&&» и «||» получается, что «0» это «true»

LXj № 16
Разве 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)
Евгений Степанищев (bolknote.ru) автор № 22
Разве exit-коды от шелла зависят?

Я немного троллю, да. Но вообще exit-коды это пережиток прошлого.

(Что-то по OpenID как lxj.endofinternet.net зайти не могу, говорит Fatal error: Cannot redeclare class hKit in /home/bolk/domains/bolknote.ru/public_html/_blok/h kit.inc.php on line 72)

Oops… А если сейчас попробовать?

gaius-julius (gaius-julius.livejournal.com) № 17
что-то мне подсказывает, что если сменить шелл, то программы не перестанут 0 возвращать в качестве успеха. (-:

Ну и вообще согласен с предыдущими ораторами — не должен баш отвечать за ляпы или спорные моменты в авторов Advanced Scripting Guide
Евгений Степанищев (bolknote.ru) автор № 20
что-то мне подсказывает, что если сменить шелл, то программы не перестанут 0 возвращать в качестве успеха. (-:

Это правда :) Я немного троллю :)

astur (astur.net.ru) № 18
Успех — один. Ошибки разные. Вот если по уму говорить, то куда бы ты порекомендовал определить ноль, а куда остальные цифры?
Евгений Степанищев (bolknote.ru) автор № 21
Успех — один. Ошибки разные. Вот если по уму говорить, то куда бы ты порекомендовал определить ноль, а куда остальные цифры?

Современный шел вообще таким заморачиваться не должен. Исключения и их обработка.

Ной (sad-wind.ya.ru) № 23

Сам баш можно убить вот за что:

At the first false (non-zero) return, the command chain terminates (the first command returning false is the last one to execute).

Это как-бы тонкая полуправда на границе с ложью.
Например, такая команда завершится без ошибки и выполнение продолжится
cat non-existent-file | grep -v 'bad' > result

P.S. мечтаю юзать PowerShell в *nix.
P.P.S. Гробить написанный коммент, если юзер забыл написать openId — невежливо.

Евгений Степанищев (bolknote.ru) автор № 24
P.P.S. Гробить написанный коммент, если юзер забыл написать openId — невежливо.

А я и не гроблю. Разве что ошибка какая-то могла случится. Можно подробнее симптомы?

Ной (sad-wind.ya.ru) № 25
Комментарий для Евгения Степанищева:

FF4
Отправляю комментарий я незаполненным именем.
Получаю назад пустую форму и «Ошибка: Введите адрес вашего сайта или блога»
maxim-zotov (maxim-zotov.livejournal.com) № 26

Комментарий для sad-wind.ya.ru:

Например, такая команда завершится без ошибки и выполнение продолжится
cat non-existent-file | grep -v 'bad' > result

Во-первых, ход мысли верный, но пример неудачный, потому что 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 будет только в случае если все команды вернули УСПЕХ. Но, видимо, там есть какие-то подводные камни, раз не сделали такое поведение поведением по умолчанию.

Евгений Степанищев (bolknote.ru) автор № 27

Комментарий для sad-wind.ya.ru:

Отправляю комментарий я незаполненным именем.
Получаю назад пустую форму и «Ошибка: Введите адрес вашего сайта или блога»

Ох, mea culpa. Буду править.

Евгений Степанищев (bolknote.ru) автор № 30
Комментарий для jankkhvej.blogspot.com:

Ну, тоже не удивили. Попробуйте ещё:

$a = null;
$a--;
$a++;
var_dump($a);

Это известное исключение (ну, известное тем, кто руководство по языку хоть раз читал, конечно). В PHP сюрпризов много, кто бы спорил. Но у bash сейчас вообще достоинств нет, кроме распространённости.
jankkhvej (jankkhvej.blogspot.com) № 31
Комментарий для Евгения Степанищева:

Ну дык и про exit status и ||, && в баше то же ж известно.

Единственный язык, который не «должен умереть» — Pascal. Хотя я отдаю себе отчёт что это у меня детская любовь.
Евгений Степанищев (bolknote.ru) автор № 32
Комментарий для jankkhvej.blogspot.com:

А Pascal чем плох, кроме многословности? Java, вон, куда более многословна.
jankkhvej (jankkhvej.blogspot.com) № 33
Комментарий для Евгения Степанищева:

Паскаль хорош, о чём я и говорю.
jankkhvej (jankkhvej.blogspot.com) № 35
Комментарий для Евгения Степанищева:

Да, но к тому времени я уже любил Pascal.