Возможна ли обработка исключений в Unix сценарии оболочки, который включает внутренний вызов других сценариев - PullRequest
0 голосов
/ 21 января 2020

У меня есть сценарий, в котором мне нужно получить некоторые данные, вызвав другой внешний файл bash из моего сценария оболочки. Если я получаю какую-либо ошибку, выводимую из внешнего bash, мой сценарий оболочки должен обработать и должен go с помощью подхода отступления. Но на самом деле я столкнулся с проблемой с этим внешним bash файлом, в котором bash возвращает (выход 1) в случаях сбоя, что приводит к тому, что мой скрипт также завершает работу и никогда не выполняет резервный подход. Может кто-нибудь подсказать, как справиться с выходом из внешнего bash и запустить мой отступающий подход.

1 Ответ

1 голос
/ 21 января 2020

Не уверен, что это работает в sh, но работает в bash. Из этого я сделал инструмент "попробовать / исключить", но, думаю, он будет работать и здесь.

#! /bin/bash

try() {
    exec 2> /dev/null
    #direct stderr out to /dev/null

    #main block
    input_function="$1"

    #fallback code
    catch_function="$3" 

    #open a sub shell
    (

    #tell it to exit upon encountering an error
    set -e

    #main block
    "$@"

    )

    #if exit code of above is > 0, then run fallback code
    if [ "$?" != 0 ]; then
        $catch_function
    else
        #success, it ran with no errors
        test
    fi

    #put stderr back into stdout
    exec 2> /dev/tty
}

Примером использования этого будет:

try [function 1] except [function 2]

Функция 1 будет основной блок кода, и 2 будет резервной функцией / блоком кода. Ваша первая функция может быть:

run() {
  /path/to/external/script
}

А вторая может быть тем, к чему вы хотите прибегнуть. Надеюсь, это поможет.

...