Возможна ли обработка исключений в сценарии оболочки Unix, который включает вызов других сценариев внутри

Возможна ли обработка исключений в сценарии оболочки Unix, который включает вызов других сценариев внутри

21.01.2020 05:38:21 Просмотров 36 Источник

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

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59833478/is-exception-handling-possible-in-unix-shell-script-which-includes-calling-anot#comment105803322_59833478
Являются ли программы и сценарии, которые вы будете запускать, должным образом дисциплинированными в том, как они сообщают об ошибках, выходя с ненулевыми статусами, когда есть проблема. Если это так, то легко заметить, когда что-то пошло не так. Если нет, то, вероятно, проще исправить их, чтобы они были достаточно дисциплинированными, чем писать код для анализа вывода стандартных ошибок из небрежно написанных программ — при условии, что они написаны достаточно тщательно, чтобы сообщать об ошибках в стандартных ошибках! Если они не обратят внимания и на это, то вас ждет мир боли.

Ответы - Возможна ли обработка исключений в сценарии оболочки Unix, который включает вызов других сценариев внутри / Is Exception handling possible in Unix shell script, which includes calling another scripts internally

Является ответом!
MIZWOZ cpu

21.01.2020 06:24:32

Не уверен, что это работает в sh, но это работает в bash. Я сделал инструмент try / except из этого, но он будет работать и здесь, я верю.

#! /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
}

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

https://stackoverflow.com/questions/59833478/is-exception-handling-possible-in-unix-shell-script-which-includes-calling-anot/59833780#comment105803279_59833780
Вы, вероятно, должны использовать "$@", а не просто $@. Это имеет значение в тот момент, когда один из аргументов содержит пробел. Если вы не ожидаетеfunction 1будет содержать аргументы (1), в этом случае вы направляетесь на сложную территорию.
https://stackoverflow.com/questions/59833478/is-exception-handling-possible-in-unix-shell-script-which-includes-calling-anot/59833780#comment105803304_59833780
Хороший улов! Я изменю свой ответ, чтобы отразить это.
https://stackoverflow.com/questions/59833478/is-exception-handling-possible-in-unix-shell-script-which-includes-calling-anot/59833780#comment105803574_59833780
Большое спасибо, я попробую это и дам вам знать
https://stackoverflow.com/questions/59833478/is-exception-handling-possible-in-unix-shell-script-which-includes-calling-anot/59833780#comment105862348_59833780
С этим есть ряд проблем. Он предполагает, что Стандартная ошибка была терминалом в первую очередь, и не работает с произвольными "блоками кода", только простыми командами с аргументами. Я не вижу пользы от простого написания if function 1; then test; else function 2; fi 2> /dev/null
Закрыть X