Почему && делает свою левую часть неизменной?

Этот сценарий:

#!/usr/bin/env bash

set -e

(
  set -e
  idontexist
  echo "launch the missiles"
) &&  echo "no errors"

принты:

line 7: idontexist: command not found
launch the missiles
no errors

с помощью GNU Bash 5.2.

Почему это?

Я предполагал, что set -e приведет к сбою линии idontexist, и ошибка выйдет наружу.

set -e не имеет эффекта при тестировании команды с использованием if или логических операторов && и ||. Это в документации.
Barmar 23.04.2024 18:28

У вас нет конвейеров, почему pipefail во фрагменте?

Barmar 23.04.2024 18:30

Спасибо! Это был остаток от попыток. я удалю для ясности

smatting 23.04.2024 18:34

«Я предполагал, что set -e сделает X» неверно почти для всех значений X. mywiki.wooledge.org/BashFAQ/105

William Pursell 23.04.2024 19:57

Также см. Bash Pitfalls #60 (set -euo Pipefail).

pjh 23.04.2024 20:19

Если бы bash вел себя не так, любой сценарий, использующий set -e, никогда бы не смог использовать if (поскольку что хорошего в условных обозначениях, которые никогда не могут быть ложными, не вызывая выхода вашего кода?). && и || также являются операторами управления потоком; не было бы никакого смысла поддерживать их, если бы был возможен только один статус выхода без принуждения к немедленному выходу.

Charles Duffy 24.04.2024 00:48

(Это все, что можно сказать: ловушки set -e, ERR и их эквиваленты безнадежно сломаны; выработайте привычку явно использовать || return и || exit и проверять их наличие во время проверки кода).

Charles Duffy 24.04.2024 00:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Со страницы руководства:

              -e      Exit  immediately if a pipeline (which may consist of a single simple command), a
                      list, or a compound command (see SHELL GRAMMAR above), exits with a non-zero sta‐
                      tus.   The  shell  does not exit if the command that fails is part of the command
                      list immediately following a while or until keyword, part of the  test  following
                      the  if  or  elif reserved words, part of any command executed in a && or || list
                      except the command following the final && or ||, any command in  a  pipeline  but
                      the  last,  or if the command's return value is being inverted with !.  If a com‐
                      pound command other than a subshell returns a non-zero status because  a  command
                      failed  while  -e  was being ignored, the shell does not exit.  A trap on ERR, if
                      set, is executed before the shell exits.  This option applies to the shell  envi‐
                      ronment  and each subshell environment separately (see COMMAND EXECUTION ENVIRON‐
                      MENT above), and may cause subshells to exit before executing all the commands in
                      the subshell.

                      If  a  compound command or shell function executes in a context where -e is being
                      ignored, none of the commands executed within the compound  command  or  function
                      body  will be affected by the -e setting, even if -e is set and a command returns
                      a failure status.  If a compound command or shell function sets -e while  execut‐
                      ing in a context where -e is ignored, that setting will not have any effect until
                      the compound command or the command containing the function call completes.

В частности

Если составная команда или функция оболочки выполняется в контексте, где используется ключ -e игнорируется, ни одна из команд не выполняется внутри составной команды или функции на тело будет влиять параметр -e, даже если установлен -e и команда возвращает результат статус отказа.

В stackoverflow.com/help/how-to-answer обратите внимание на раздел «Отвечать на хорошо задаваемые вопросы» и пункт в нем, касающийся вопросов, которые «задавались и на которые давались ответы уже много раз».

Charles Duffy 24.04.2024 00:47

Другие вопросы по теме