Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет superhuman ([info]superhuman)
@ 2016-12-27 23:04:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Увидев, как в баше применяют "||" для сигнализирования об ошибке, завис. Ленивый эвал (short circuit) работает не так!

Помедитировав и почитав маны, разобрался. В баше и прочих шеллах всё перепутано. "||" - это не "или", а "и", а "&&" - это "или". В юникс шеллах, оказывается, true возвращает 0, a false - 1.

Дебильней шелловских нету языков программирования. Никогда их не применяю, и никому не советую.


(Добавить комментарий)


[info]do_
2016-12-28 02:11 (ссылка)
> В юникс шеллах, оказывается, true возвращает 0, a false - 1.

да нихуя себе, вот детское изумление

в сях вообще-то то же самое

(Ответить) (Ветвь дискуссии)


[info]phantom
2016-12-28 02:35 (ссылка)
А ты перечитай предложение ещё раз. Всё ещё то же самое?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]do_
2016-12-28 02:43 (ссылка)
да, когда функция возвращает 0 -- это true, всё остальное -- это false
шелловские команды true/false вполне соответствуют этому соглашению, всё логично, вроде бы

(я о возвращаемых значениях, а не о типе bool, которого в стандартных сях и нету)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-12-28 02:53 (ссылка)
Вообще-то, в С99 добавили тип bool: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html

Я согласен, что код ошибки должен быть нулём в случае успешного выполнения. Я лишь считаю дебилизмом переопределение логических значений и операций в угоду кодам ошибок. Во всех цилизованных ЯП логические операции определяются через целые числа. Битовые операция & и логическая операция && должны быть согласованы, а не, как в шеллах, противоречить друг другу.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]do_
2016-12-28 03:24 (ссылка)
"стандартный си" -- это керниган и ричи, например
а потом много всякого напридумывали

ладно, в главном ты прав, если определитть

int true() { return 0; }
и
int false() { return 1; }

то оно будет работать не как в шелле, а наоборот,
подобное можно прокомментировать только словами happy debug

но тут как раз у шелла преимущество: у шелла соглашение соответствует логическим операциям, а в сях наоборот, и это как раз правильно, я считаю

хотя бы потому, что выражение, составленное из
значений true, false и логических операций должно давать правильный результат, в шелле это так, в сях наоборот(если пользоваться результатами функций, а не типом bool)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-12-28 18:53 (ссылка)
У шелла нет преимущества такого, потому что там не логические значения чейнят, а результаты выполнения команд/функций. Которые возвращают коды ошибок/инты, а не логические значения. Чейнить можно и нужно, не надо называть это "логическими операциями"/&&/||. Пусть назывались бы операторы -> и ?!, например.

Нет, блядь, надо назвать success = true = 0, сделать && и & противоречащими, и ебитесь конём, дорогие программеры. Давай ещё + и - поменяем, и переопределим умножение делением. И никаких грибов не надо будет.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]do_
2016-12-28 20:21 (ссылка)
Ну, вообще-то непонятно, почему ты так привязался к числовому статусу выполнения команд, который почти нигде в сыром виде не используется. Везде используется булевый статус, который отражает, успешно ли завершилась команда. Когда команда завершилась успешно, то её булевый статус завершения success=true, в то время как целочисленный статус завершения $?=0

Претензии, почему именно так -- к разработчикам юникса, а не к шеллу как таковому, но особых проблем это не создаёт, потому что, повторяю, числовой статус как таковой редко используется.

&& и & не являются противоречащими, хотя бы потому что в шелле & и нету нигде, за исключением выражений, где используется т.н. ARITHMETIC EVALUATION. В ARITHMETIC EVALUATION операторы & и | имеются, но там и && и || работают как в сях.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-12-28 22:39 (ссылка)
Претензии именно к шеллам (хотя их и трудно от юникса отделить). Обычно, как раз, в системах на си используют return-значение для кода ошибки, а не булево значение. И всегда 0 - это успех, остальные коды - это коды ошибок, собственно. И всегда это инты (как значения энумов).

Да, создаёт проблемы. И в этом конкретном случае, и вообще, когда скрипты шелловские разрастаются до нескольких тысяч строчек хотя бы, начинается полная хуета, потому что как ЯП они - говно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]do_
2016-12-28 23:05 (ссылка)
По-любому скрипты на шелле читабельнее сишного кода(хотя это несложно, на фоне си почти любой язык выигрывает).

(Ответить) (Уровень выше)


[info]do_
2016-12-28 23:17 (ссылка)
В целом, я не понял, какие у тебя проблемы, ты просто зациклился на числовых статусах, а надо думать в терминах успех/неуспех. Главное, чтоб код был внутрене непротиворечив, как он работает там внутри -- неважно. Знание о числовых статусах -- это дополнительное знание о "внутреннем устройстве", которое в 99% случаев излишне.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-12-28 23:24 (ссылка)
Да нет проблем. Просто блевать тянет, когда скрипты на баше читаю. Сам же я не лабаю на них, это лишь одна из причин почему.

(Ответить) (Уровень выше)


[info]phantom
2016-12-28 03:14 (ссылка)
Короче, говоря, то, что в баше пишут так:

some_command || print_error

в си пишут буквально так:

some_command() && print_error();

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]do_
2016-12-28 03:32 (ссылка)
ну так логично

выполни операцию ИЛИ сдохни

в сях получается выполни операцию И сдохни.
чего сдыхать-то, если операция выполнена успешно?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-12-28 03:44 (ссылка)
Грубо говоря, это мышление не программиста, а питониста, например. Мол, давайте сделаем так, чтобы можно было программу читать на естественном английском языке. Отсюда такие проблемы с синтаксисом во многих кривых ЯП.

Программист же должен понимать, что && - это всего лишь стандартный and, применимый и к числам, и к логическим значениям одинаковым образом, и должен думать сразу на ЯП, а не на английском.

К слову, в мире PLC и "safety" считается, что success - это 1, вот там совсем уж можно додебажиться и ёбнуться.

Короче, не надо двадцать разных способов. And и логические значения определять надо канонически.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]do_
2016-12-28 05:45 (ссылка)
А как же "программы пишутся для людей, а не для машин"?

В остальном я даже не знаю, как комментировать, сперва яростное питонохульство,
потом "Короче, не надо двадцать разных способов." -- один из краеугольных питоновских принципов(каждая реально отличающаяся от других задача делается одним и тем же единственным способом).

And и or в шелле определён вполне канонически, просто надо понимать, что логические значения определяются как not $?. Если тебе это не нравится, то тебе как минимум придётся переделывать абсолютное большинство ныне существующих и активно использующихся операционок, в которых существует такое понятие, как код завершения процесса, и он варьирует от нуля в случае успешного заверщения до 255. Шелл -- это ведь не просто ЯП, это ЯП, рассчитанный на выполненние сторонних, не имеюших никакого отношения к самому шеллу программ, и эта специфика накладывает определённые ограничения.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-12-28 18:43 (ссылка)
Программы пишутся, в первую очередь, для машин, во вторую, - для людей. Причём не нужно рассчитывать на быдлокодеров, когда пишешь программу. Также не стоит под быдлокодеров дизайнить языки, как питон, например.

Я слышал, что в питоне "должен быть один очевидный способ делать что-то". Только ради этой очевидности Гнида ван Россум нахуевертил кривых костылей в язык, где только можно и нельзя. По факту, там есть двадцать способов кривых сделать что-то, а также один особо кривой, который питонисты считают за "очевидный".

Ну а шелл, как ЯП, это даже не питон, и даже не перл. Это ДСЛ, который внезапно стали применять для общего программирования. И как всегда в таких случаях, хуйня выходит.

(Ответить) (Уровень выше)


[info]do_
2016-12-28 03:42 (ссылка)
(следующий коммент был хуйня)

(Ответить) (Уровень выше)


[info]yone
2016-12-28 16:06 (ссылка)
> в си пишут буквально так:

> some_command() && print_error();

Никто так не пишет, кроме как для IOCCC какого-нибудь. Ну и print_error() тогда тоже что-то, кастующееся к инту должно возвращать, иначе не скомпилируется даже. Вот зачем ты такую хуйню пишешь?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-12-28 18:35 (ссылка)
Правильно, не пишут - это же буквальный перевод баша был.

К слову, на си не стоит и макроёбством заниматься. Это к тому, что ты тоже хуйню пишешь.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yone
2016-12-28 20:20 (ссылка)
> Правильно, не пишут - это же буквальный перевод баша был.

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

Кстати, если бы || был определён, как ты предлагаешь,

if true || false; then
    echo aaa
else
    echo bbb
fi


выводило бы bbb.

> К слову, на си не стоит и макроёбством заниматься

Почему не стоит?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-12-28 22:45 (ссылка)
Обычно, как раз, в системах на си используют return-значение для кода ошибки, а не булево значение. И всегда 0 - это успех, остальные коды - это коды ошибок, собственно. И всегда это инты (как значения энумов).

В шеллах true и false переопределены тоже по-дебильному. True - это единица, если ты не еврей и не из древнего Ебипта. Success = 0. Success, а не true, блядь. И тогда логические операции будут нормальными тоже.

Потому что макросистема на си - это полная негомоиконная хуйня, на которой лабать - только проблемы плодить. Метапрограммирование стоит использовать, прежде всего, в лиспоподобных языках.

(Ответить) (Уровень выше)


[info]phantom
2016-12-28 18:46 (ссылка)
А, и print_error(), конечно же, тоже возвращает код ошибки, как и любая башеподобная функция. Это же, блядь транслитерация баша была, что непонятно?

(Ответить) (Уровень выше)


(Анонимно)
2016-12-28 04:35 (ссылка)
когда функция возвращает 0, это значит, что она успешно выполнена, иначе возвращается код ошибки, а к true и false это не относится никак вообще, совсем-совсем:

The remaining three macros are suitable for use in #if preprocessing directives. They are:
true
which expands to the integer constant 1,
false
which expands to the integer constant 0,

из c89 и stdbool.

собственно, true и false определены в том числе и поведением if, в котором false это 0

(Ответить) (Уровень выше)