Нужна помощь в реализации обработчика ошибок

Я пытаюсь реализовать обработчик ошибок. Это помощник, который проверяет наличие кода ошибки в переменной $? и завершает сценарий с кодом и сообщением.

Приведенный ниже код довольно прост и самоочевиден, но он не работает и Я вообще не понимаю, что происходит. Я пробовал передать $? в качестве аргумента этой функции, но это тоже не работает. Что мне не хватает?

#!/bin/bash

#this line causes error "asd: command not found"
asd

exit_if_error () {
  ERROR_STATUS="$1"
  ERROR_TEXT="$2"
  if [ "$?" != "0" ]; then
    # prints an error message on standard error and terminates the script with an exit status
    echo "$ERROR_TEXT" 1>&2
    exit "$ERROR_STATUS"
  fi
}

exit_if_error "1" "Something bad happened"

echo "No errors during execution"

Это тоже не работает

#!/bin/bash

#this line causes error "asd: command not found"
asd

exit_if_error () {
  ERROR="$1"
  ERROR_STATUS="$2"
  ERROR_TEXT="$3"
  if [ "$ERROR" != "0" ]; then
    # prints an error message on standard error and terminates the script with an exit status of 1
    echo "$ERROR_TEXT" 1>&2
    exit "$ERROR_STATUS"
  fi
}

exit_if_error "$?" "1" "Something bad happened"

echo "No errors during execution"

Как вы обрабатываете ошибки в своих скриптах? Вы пишете подобный код? Я просто пытаюсь найти менее подробное решение.

command_a
if [ "$?" != "0" ]; then
  echo "command_a failed..." 1>&2
  exit 1
fi

command_b
if [ "$?" != "0" ]; then
  echo "command_b failed..." 1>&2
  exit 1
fi

...
0
задан 5 December 2020 в 19:41

1 ответ

Для перехвата сигнала ошибки необходимо использовать ловушку.

#!/bin/bash

ERROR=0
error_handling(){
    ((ERROR > 0)) &&
    printf %s\ %s\\n "$1" "$2"
    exit $ERROR
}
trap "ERROR=1" ERR

jdshfsduoifh

error_handling 1 "PANIC error!"

Bash имеет встроенную функцию для обработки отсутствующих команд

#!/bin/bash

command_not_found_handle(){
    echo "Command '$@' not found, please install me!"
}

jdshfsduoifh

Если вы действительно хотите отключить сообщения, вы можете перенаправить stderr на /dev/null.

#!/bin/bash

exec 3>&2 2>/dev/null

# This error will be
# redirected to /dev/null
ls nonexistant_1
(($? > 0)) &&
echo "Error: this isn't right!"

# Let's restore our old descriptor.
exec 2>&3 3>&-

ls nonexistant_2
exit

Возможно, Stderr уже имеет назначенный дескриптор; пример script.sh 2> file.log, используя exec для управления дескриптором текущей оболочки, нам сначала нужно продублировать stderr в новый дескриптор, прежде чем назначать /dev/null для stderr позволяет восстановить старый дескриптор.

3
ответ дан 5 December 2020 в 16:56

Другие вопросы по тегам:

Похожие вопросы: