Я пытаюсь реализовать обработчик ошибок. Это помощник, который проверяет наличие кода ошибки в переменной $?
и завершает сценарий с кодом и сообщением.
Приведенный ниже код довольно прост и самоочевиден, но он не работает и Я вообще не понимаю, что происходит. Я пробовал передать $?
в качестве аргумента этой функции, но это тоже не работает. Что мне не хватает?
#!/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
...
Для перехвата сигнала ошибки необходимо использовать ловушку
.
#!/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 позволяет восстановить старый дескриптор.