1

Я хочу, чтобы bash-приложение уничтожало библиотеку в случае сбоя функции библиотеки.

Мне сказали, что set -e делает это.

lib.sh

#!/bin/bash

function die
{
    echo "dying: $1"
    exit 1
}

function get_info
{
    die "oops an error"
}

app.sh

#!/bin/bash

set -e

source "lib.sh"

echo "info: $(get_info)"

echo "ok"

Запустить его

$> bash app.sh
info: dying: oops an error
ok

die вышел с 1 , так app.sh с set -e должно быть убит тоже, верно?

Почему это не сработало?

1 ответ1

2

Я думаю, то, как вы используете это, является запутанной частью. Проблема в том, что вы не просто вызываете get_info , вы используете результат этого как часть другой команды (echo здесь). Эта другая команда выполняется успешно, и поэтому условие ошибки никогда не приводит к выходу из bash. Вы можете увидеть это, если немного расширите свой скрипт:

echo "info: $(get_info)"
echo "ok"

v=$(get_info)
printf 'info2: %s\n' "$v"
printf 'ok2\n'

никогда не попадет на печать info2 , потому что она выходит во время присваивания переменной.

set -e действительно сложно, часто не рекомендуется. Вы можете прочитать больше об этом здесь и здесь

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .