Sobes.tech
Middle

Чӣ гуна хатогиҳои корбариро дар bash коркард мекунӣ?

sobes.tech AI

Ҷавоб аз AI

У bash карыстальніцкія памылкі ў асноўным апрацоўваюцца з выкарыстаннем:

  • Кодаў выхаду каманд: Кожная каманда вяртае код завяршэння (exit status). 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 "$@"