LINUX.ORG.RU

История изменений

Исправление emulek, (текущая версия) :

Мне нужно не разделить выполнение по условию на две ветки, а детектировть наличие ошибки в цепочке из нескольких обязательных действий. Конструкция «a && b && ... && z || echo Ошибка!» делает именно это.

она не совсем это делает. Точнее это совсем НЕ конвейер. Конвейер это когда несколько работяг _одновременно_ выполняют одну и ту же _свою_ операцию. А вот && это _последовательное_ выполнение.

У вас вообще жопа:

a && b && (c && d && e) || f
Скобки в баш НЕ то, что в C/C++. Это субшелл. Т.е. у вас

1. запускается a

2. если a успешно, запускается b

3. если b успешно, запускается суб-процесс, в котором запускается c && d && e

4. если суб-процесс не успешен, запускается f

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

function foo()
{
  command_a || return
  command_b || return
  …
  command_z
}

foo
err=$?

if [ $err != 0 ]; then
  echo "error #$err"
  exit $err
fi

в этом коде foo() возвращает код ошибки, если она была.

Исходная версия emulek, :

Мне нужно не разделить выполнение по условию на две ветки, а детектировть наличие ошибки в цепочке из нескольких обязательных действий. Конструкция «a && b && ... && z || echo Ошибка!» делает именно это.

она не совсем это делает. Точнее это совсем НЕ конвейер. Конвейер это когда несколько работяг _одновременно_ выполняют одну и ту же _свою_ операцию. А вот && это _последовательное_ выполнение.

У вас вообще жопа:

a && b && (c && d && e) || f
Скобки в баш НЕ то, что в C/C++. Это субшелл. Т.е. у вас

1. запускается a

2. если a успешно, запускается b

3. если b успешно, запускается суб-процесс, в котором запускается c && d && e

4. если суб-процесс не успешен, запускается f

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

function foo()
{
  command_a || return
  command_b || return
  …
  command_z
}

foo
err=$?

if [ $err != 0 ]; then
  echo "error #err"
  exit $err
fi

в этом коде foo() возвращает код ошибки, если он был.