Как сделать так, чтобы одна оболочка bash выходила из основного сценария вызывающей оболочки? - PullRequest
0 голосов
/ 28 мая 2018

Наличие следующего скрипта bash:

#!/bin/bash

set -e

function foo() {
  # commands that might fails and I want to exit my script
  ...
  echo "result I need as output"
}

my_var=$(foo)

echo "I don't want this if there is an error inside foo"

Использование set -e (в bash 4.4.19), похоже, не работает с подоболочками, т.е. последняя команда echo все еще выполняется).Как я могу написать код для завершения работы скрипта, если любая из команд внутри foo завершается с ненулевым кодом выхода.

Я использую bash GNU bash, version 4.4.19(1)-release (x86_64-apple-darwin16.7.0), и результат вызова моего скрипта равен (где точки заменены неверной командой head -this:

$ ./my_script
head: illegal option -- t
usage: head [-n lines | -c bytes] [file ...]
I don't want this if there is an error inside foo

1 Ответ

0 голосов
/ 28 мая 2018

Изменено в комментариях

состояние выхода команды конвейера - это состояние выхода последней команды, его можно изменить с помощью set -o pipefail, поэтому статус выхода конвейера будет <>0 для любой команды.статус выхода - <>0.

Первый ответ

, так как вы использовали опцию -e, достаточно, чтобы функция вернула код выхода, отличный от 0, например return 1

в более общем случае (без set -e) может быть лучше использовать явный выход

my_var=$(foo) || exit 1

может быть достаточно, поскольку ошибка может быть записана в стандартной ошибке (унаследованной) в подоболочке.

В противном случае, внимательно читая руководство, можно объяснить, почему оно не работает так, как вы ожидали

set -e

Выйти немедленно, если [...] вернет aненулевой статус.Оболочка не завершает работу, если сбойная команда является частью списка команд, следующих сразу за ключевым словом некоторое время или до, часть теста в операторе if, часть любой команды, выполняемой в && или ||список, за исключением команды, следующей за последним символом && или ||, [...].

Этот параметр применяется к среде оболочки и каждой среде подоболочки отдельно (см. Среду выполнения команд) и может привести к выходу подоболочек довыполнение всех команд в подоболочке.

[...]

И из среды выполнения команд

Подоболочки, порожденные для выполнения подстановок команд, наследуютзначение параметра -e из родительской оболочки.Когда Bash не находится в режиме POSIX, в таких подоболочках параметр -e очищается.

...