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

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

maxim-zotov (maxim-zotov.livejournal.com)
7 июля 2010, 15:43

А что не так?

bolk (bolknote.ru)
7 июля 2010, 15:49, ответ предназначен maxim-zotov (maxim-zotov.livejournal.com):

0 — True
!0 — False

Всё так? :)

maxim-zotov (maxim-zotov.livejournal.com)
7 июля 2010, 15:56

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

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

deniszh (deniszh2.ya.ru)
7 июля 2010, 16:01

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

bolk (bolknote.ru)
7 июля 2010, 16:02, ответ предназначен maxim-zotov (maxim-zotov.livejournal.com):

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

bolk (bolknote.ru)
7 июля 2010, 16:03, ответ предназначен deniszh (deniszh2.ya.ru):

ээээ... ну так exit code 0 - это все гут, не 0 - все плохо. Выполнять цепочку команд пока все
Совершенно нелогично, что «A && B» должно выполнить «B», если «A» вернуло ноль, не так ли?

borzdeg.blogspot.com (borzdeg.blogspot.com)
7 июля 2010, 16:05

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

maxim-zotov (maxim-zotov.livejournal.com)
7 июля 2010, 16:12, ответ предназначен bolk (bolknote.ru):

Ну это не повод считать, что 0 это true :)
true оно называется для того, чтобы логические выражения типа "A && B" оперировали обычными для них понятиями "true" и "false". Ведь именно такими значениями оперируют логические выражения. Да, более точный смысл - "success" и "fail", но какая разница?

bolk (bolknote.ru)
7 июля 2010, 16:19, ответ предназначен borzdeg.blogspot.com:

что-то я тоже не догоняю - хде "ржать"-то?
Второй коммент.

bolk (bolknote.ru)
7 июля 2010, 16:19, ответ предназначен maxim-zotov (maxim-zotov.livejournal.com):

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

deniszh (deniszh2.ya.ru)
7 июля 2010, 17:33, ответ предназначен bolk (bolknote.ru):

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

hshhhhh.name (hshhhhh.name)
7 июля 2010, 18:00

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

bolk (bolknote.ru)
7 июля 2010, 18:26, ответ предназначен deniszh (deniszh2.ya.ru):

bash как раз тут ведет себя абсолютно логично - его авторы не писали что "zero" это "true"...
Тем не менее, по операциям «&&» и «||» получается, что «0» это «true»

bolk (bolknote.ru)
7 июля 2010, 18:27, ответ предназначен hshhhhh.name:

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

jankkhvej (jankkhvej.blogspot.com)
7 июля 2010, 19:04

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

LXj (инкогнито)
7 июля 2010, 19:13

Разве 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)
7 июля 2010, 20:02

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

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

astur (astur.net.ru)
7 июля 2010, 20:54

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

bolk (bolknote.ru)
7 июля 2010, 23:40, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

А какой — хороший? lisp?
Например, PowerShell. zsh хорош.

bolk (bolknote.ru)
7 июля 2010, 23:41, ответ предназначен gaius-julius (gaius-julius.livejournal.com):

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

bolk (bolknote.ru)
7 июля 2010, 23:42, ответ предназначен astur (astur.net.ru):

Успех - один. Ошибки разные. Вот если по уму говорить, то куда бы ты порекомендовал определить ноль, а куда остальные цифры?
Современный шел вообще таким заморачиваться не должен. Исключения и их обработка.

bolk (bolknote.ru)
7 июля 2010, 23:46, ответ предназначен 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)
8 июля 2010, 15:04

Сам баш можно убить вот за что:
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 - невежливо.

bolk (bolknote.ru)
8 июля 2010, 15:57, ответ предназначен Ной (sad-wind.ya.ru):

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

Ной (sad-wind.ya.ru)
8 июля 2010, 17:53, ответ предназначен bolk (bolknote.ru):

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

maxim-zotov (maxim-zotov.livejournal.com)
8 июля 2010, 18:53, ответ предназначен Ной (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 будет только в случае если все команды вернули УСПЕХ. Но, видимо, там есть какие-то подводные камни, раз не сделали такое поведение поведением по умолчанию.

bolk (bolknote.ru)
8 июля 2010, 19:39, ответ предназначен Ной (sad-wind.ya.ru):

Отправляю комментарий я незаполненным именем.
Получаю назад пустую форму и "Ошибка: Введите адрес вашего сайта или блога"
Ох, mea culpa. Буду править.

jankkhvej (jankkhvej.blogspot.com)
11 июля 2010, 23:00

Сделайте в PHP

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

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

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

jankkhvej (jankkhvej.blogspot.com)
11 июля 2010, 23:01

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

конечно же

bolk (bolknote.ru)
12 июля 2010, 00:30, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

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

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

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

jankkhvej (jankkhvej.blogspot.com)
12 июля 2010, 00:38, ответ предназначен bolk (bolknote.ru):

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

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

bolk (bolknote.ru)
12 июля 2010, 09:18, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

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

jankkhvej (jankkhvej.blogspot.com)
12 июля 2010, 14:22, ответ предназначен bolk (bolknote.ru):

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

bolk (bolknote.ru)
13 июля 2010, 23:59, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

Oberon-2 — лучше.

jankkhvej (jankkhvej.blogspot.com)
17 июля 2010, 11:09, ответ предназначен bolk (bolknote.ru):

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)