Bash / Exit code ба алдаа зохицуулах

Exit code ба алдаа зохицуулах

Bash script дуусахдаа үргэлж тоон утга буцаадаг — үүнийг exit code буюу return code гэнэ. 0 нь амжилттай, 0-с өөр дурын тоо нь алдаа гэсэн утгатай. Энэ ойлголтыг мэдэхгүйгээр найдвартай script бичих боломжгүй.

Exit code гэж юу вэ?

bash
# Амжилттай команд
ls /home
echo $?    # 0 — амжилттай

# Алдаатай команд
ls /байхгүй-зам
echo $?    # 2 — алдаа гарсан

# Команд олдоогүй
blahblah
echo $?    # 127 — команд олдсонгүй

$? нь хамгийн сүүлд ажиллуулсан командын exit code-ийг агуулдаг. Шалгахдаа заавал шууд дараагийн мөрт бичих хэрэгтэй — дараагийн команд ажиллавал $? шинэчлэгдэнэ.

Нийтлэг exit code-ууд:

bash
# 0   — амжилттай
# 1   — ерөнхий алдаа
# 2   — буруу хэрэглэлт (аргументын алдаа)
# 126 — файл ажиллуулах эрхгүй
# 127 — команд олдсонгүй
# 128 — буруу exit аргумент
# 130 — Ctrl+C-ээр цуцлагдсан
# 137 — kill -9-ээр зогсоогдсон

exit команд — script-аас гарах

bash
#!/bin/bash

# Тодорхой exit code-тай гарах
exit 0     # амжилттай
exit 1     # алдаатай

# Практик жишээ — файл шалгаж гарах
if [ ! -f "config.txt" ]; then
  echo "Алдаа: config.txt файл олдсонгүй" >&2
  exit 1
fi

echo "Config файл байна, үргэлжлүүлж байна..."
exit 0

Алдааны мессежийг >&2 ашиглан stderr рүү бичдэг нь сайн дадлага — энэ нь алдааг стандарт гаралтаас тусгаарладаг.

Командуудыг гинжлэх — && ба ||

bash
# && — зүүн тал амжилттай байж байж баруун тал ажиллана
mkdir /tmp/mydir && echo "Директор үүслээ"
# mkdir амжилттай бол "Директор үүслээ" хэвлэнэ

# || — зүүн тал АМЖИЛТГҮЙ болж байж баруун тал ажиллана
mkdir /tmp/mydir || echo "Директор үүсгэхэд алдаа гарлаа"
# mkdir алдаатай бол анхааруулга хэвлэнэ

# Нэгтгэж ашиглах
mkdir /tmp/newdir && cd /tmp/newdir && echo "Амжилттай нэвтэрлээ"
# Бүх алхам амжилттай байж байж дараагийн алхам ажиллана

set -e ба set -u — автомат алдаа зохицуулалт

bash
#!/bin/bash
set -e    # Алдаа гарахад script шууд зогсоно
set -u    # Тодорхойлогдоогүй variable ашиглахад алдаа гарна
set -o pipefail  # Pipe-н дундах алдааг ч барина

# Эсвэл богино хэлбэрт нэгтгэж бичнэ
set -euo pipefail

echo "Эхэллээ"
ls /байхгүй-зам   # Энд алдаа гарна → script шууд зогсоно
echo "Энэ мөр ажиллахгүй"   # Хэзээ ч хүрэхгүй

set -euo pipefail гурвалыг script-ийн эхэнд үргэлж бичих нь мэргэжлийн хөгжүүлэгчдийн нийтлэг дадлага юм.

Алдааг зохицуулах функц

bash
#!/bin/bash
set -euo pipefail

# Алдааны функц
error_exit() {
  echo "АЛДАА: $1" >&2
  echo "Файл: ${BASH_SOURCE[1]}, Мөр: ${BASH_LINENO[0]}" >&2
  exit 1
}

# Командыг шалгаж ажиллуулах
run_step() {
  local description="$1"
  shift
  echo "→ $description..."
  if "$@"; then
    echo "  ✓ Амжилттай"
  else
    error_exit "$description амжилтгүй боллоо"
  fi
}

# Хэрэглэх
run_step "Директор үүсгэх" mkdir -p /tmp/deploy
run_step "Файл хуулах" cp ./app.sh /tmp/deploy/
run_step "Эрх тавих" chmod +x /tmp/deploy/app.sh

echo "Бүх алхам амжилттай дууслаа!"

Exit code ба алдаа зохицуулалтыг сайн ойлгосноор таны script найдвартай, debug хийхэд хялбар болно. Энэ нь хамгийн чухал дадлагуудын нэг тул цаашид байнга ашиглаарай.

Дараагийн хичээлд:

trap командыг судална — script ажиллаж байхад гарах сигнал, алдаа, цуцлалтыг барьж, цэвэрлэгээний код ажиллуулах арга.