Sobes.tech
Middle

Как обработваш потребителски грешки в bash?

sobes.tech AI

Отговор от AI

В bash основно се обработват потребителските грешки чрез:

  • Кодове за изход на командите: Всяка команда връща код за завършване (статус на изход). 0 обикновено означава успех, всяка друга стойност — грешка.
  • Условни конструкции: if, elif, else се използват за проверка на кодовете за изход.
  • Логически оператори: && (и), || (или) позволяват изпълнение на команди в зависимост от успеха/неуспеха на предишните.
  • Пренасочване на изход: > (stdout), 2> (stderr), &> (stdout и stderr).
  • Ловушки (traps): Позволяват изпълнение на команда при получаване на сигнал или при приключване на скрипта.

Примери:

#!/bin/bash

# Проверка на кода за изход
if ! command_that_might_fail; then
  echo "Грешка при изпълнение на командата!" >&2 # Пренасочване към stderr
  exit 1 # Завършване на скрипта с грешка
fi

# Логически оператор &&
command_successful && echo "Командата е изпълнена успешно" || echo "Командата завърши с грешка"

# Ловушка за SIGINT (Ctrl+C)
trap 'echo "Получен сигнал за прекъсване. Изход..."; exit 1' SIGINT

# Пренасочване на грешки и съобщение
if command_with_errors 2> error.log; then
  echo "Командата е изпълнена без грешки"
else
  echo "Обнаружени грешки. Подробности в error.log"
fi

За повишаване надеждността на скриптовете се използват също:

  • set -e: Скриптът спира при всяка неуспешна команда (освен в if и while).
  • set -u: Променливите трябва да бъдат дефинирани преди употреба.
  • set -o pipefail: Кодът за изход на конвейера става този на последната команда, която е неуспешна.
#!/bin/bash

set -euo pipefail

# Този скрипт ще спре, ако "undefined_var" не е зададена
echo "$undefined_var"

# Този скрипт ще спре, ако "failing_command" върне ненулев код
failing_command

Използване на функции и аргументи:

#!/bin/bash

# Функция с проверка на аргументите
validate_args() {
  if [ $# -ne 2 ]; then
    echo "Използване: $0 <аргумент1> <аргумент2>" >&2
    exit 1
  fi
}

validate_args "$@"