Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Труъ 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) 2010

А что не так?

Евгений Степанищев (bolknote.ru) 2010

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

0 — True
!0 — False

Всё так? :)

maxim-zotov (maxim-zotov.livejournal.com) 2010

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

И в bat-файлах те же конструкции можно использовать:
http://www.rsdn.ru/article/winshell/batanyca.xml#EHBAE

deniszh (deniszh2.ya.ru) 2010

ээээ... ну так exit code 0 — это все гут, не 0 — все плохо. Выполнять цепочку команд пока все

Евгений Степанищев (bolknote.ru) 2010

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

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

Евгений Степанищев (bolknote.ru) 2010

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

ээээ... ну так exit code 0 — это все гут, не 0 — все плохо. Выполнять цепочку команд пока все

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

borzdeg.blogspot.com 2010

что-то я тоже не догоняю — хде «ржать»-то?

maxim-zotov (maxim-zotov.livejournal.com) 2010

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

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

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для borzdeg.blogspot.com:

что-то я тоже не догоняю — хде «ржать»-то?

Второй коммент.

Евгений Степанищев (bolknote.ru) 2010

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

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

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

deniszh (deniszh2.ya.ru) 2010

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

Ну тогда уже не «пусть bash умрет», а пусть авторы «Advanced Bash-Scripting Guide» умрут. :)
bash как раз тут ведет себя абсолютно логично — его авторы не писали что «zero» это «true»...

hshhhhh.name 2010

да, я вот не могу аргументированно ничего сказать и мне вообще все равно, но уберите руки от баша! :D

Евгений Степанищев (bolknote.ru) 2010

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

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

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для hshhhhh.name:

да, я вот не могу аргументированно ничего сказать и мне вообще все равно, но уберите руки от баша! :D

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

jankkhvej (jankkhvej.blogspot.com) 2010

А какой — хороший? lisp?

LXj 2010

Разве 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)

gaius-julius (gaius-julius.livejournal.com) 2010

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

Ну и вообще согласен с предыдущими ораторами — не должен баш отвечать за ляпы или спорные моменты в авторов Advanced Scripting Guide

astur (astur.net.ru) 2010

Успех — один. Ошибки разные. Вот если по уму говорить, то куда бы ты порекомендовал определить ноль, а куда остальные цифры?

Евгений Степанищев (bolknote.ru) 2010

Комментарий для jankkhvej.blogspot.com:

А какой — хороший? lisp?

Например, PowerShell. zsh хорош.

Евгений Степанищев (bolknote.ru) 2010

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

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

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

Евгений Степанищев (bolknote.ru) 2010

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

Успех — один. Ошибки разные. Вот если по уму говорить, то куда бы ты порекомендовал определить ноль, а куда остальные цифры?

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

Евгений Степанищев (bolknote.ru) 2010

Комментарий для LXj:

Разве 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… А если сейчас попробовать?

Ной (sad-wind.ya.ru) 2010

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

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) 2010

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

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

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

Ной (sad-wind.ya.ru) 2010

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

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

maxim-zotov (maxim-zotov.livejournal.com) 2010

Комментарий для 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) 2010

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

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

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

jankkhvej (jankkhvej.blogspot.com) 2010

Сделайте в PHP

<?php
$a = false;
$a++;
var_dump($a);

<?php
$a = false;
a += 1;
var_dump($a);

И подумайте, кого ещё надо уничтожить? 8-)

jankkhvej (jankkhvej.blogspot.com) 2010

Комментарий для jankkhvej.blogspot.com:

<?php
$a = false;
$a += 1;
var_dump($a);

конечно же

Евгений Степанищев (bolknote.ru) 2010

Комментарий для jankkhvej.blogspot.com:

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

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

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

jankkhvej (jankkhvej.blogspot.com) 2010

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

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

Единственный язык, который не «должен умереть» — Pascal. Хотя я отдаю себе отчёт что это у меня детская любовь.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для jankkhvej.blogspot.com:

А Pascal чем плох, кроме многословности? Java, вон, куда более многословна.

jankkhvej (jankkhvej.blogspot.com) 2010

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

Паскаль хорош, о чём я и говорю.

Евгений Степанищев (bolknote.ru) 2010

Комментарий для jankkhvej.blogspot.com:

Oberon-2 — лучше.

jankkhvej (jankkhvej.blogspot.com) 2010

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

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