Учитывая, что я использую bash с 1996 года (до этого я использовал tcsh или что-то еще), я был очень удивлен, наткнувшись сегодня на эту ошибку. И я потратил на это много времени.
Проблема заключалась в том, чтобы объявить переменную и немедленно присвоить ей значение. Присвоение стало результатом вызова отдельной программы.
Каждый раз, когда я это делал, возвращаемое значение всегда было 0. Вы можете увидеть, что вы ожидаете от присвоения результата /bin/false переменной в следующем фрагменте. Я ожидаю, что это будет 1:
Если у меня не будет глупого момента, я не могу придумать другой язык, который действовал бы так же.
Кстати, ключевое слово local внутри функции действует таким же образом (вот где я видел проблему).
Это упоминается на справочной странице в разделе SHELL BUILTIN COMMANDS под declare (и typeset):
Возвращаемое значение равно 0, если только … [что-то связанное с функциями, переменными только для чтения, синтаксисом массива, недопустимыми именами и т. д.]
И для local:
Статус возврата равен 0, если только
localне используется вне функции, не указано недопустимое имя или имя не является переменной, доступной только для чтения.
Итак, вот оно: declare,(typeset,) и local — все это отдельные операторы со своими собственными возвращаемыми значениями, маскирующими все, что происходит внутри любого присваивания. Безумный.