Bash / Script debug хийх

Script debug хийх

Script бичихэд алдаа гарах нь хэвийн зүйл — мэргэжлийн хөгжүүлэгчид ч мөн адил алдаа гаргадаг. Чухал нь алдааг хурдан олж засах чадвар юм. Bash-д debug хийх хэд хэдэн хүчирхэг хэрэгсэл байдаг бөгөөд эдгээрийг мэдэхэд цаг хугацааг маш их хэмнэнэ.

set -x — командуудыг ажиллахаас өмнө харуулах

set -x нь хамгийн хэрэгтэй debug хэрэгсэл юм. Команд бүрийг ажиллахаас өмнө + тэмдгийн дараа хэвлэдэг:

bash
#!/bin/bash
set -x    # Debug горим асаах

NAME="Батболд"
echo "Сайн уу, $NAME"
ls /home

# set +x   ← debug горимыг унтраана

Гаралт:

код
+ NAME=Батболд
+ echo 'Сайн уу, Батболд'
Сайн уу, Батболд
+ ls /home
batbold

+ тэмдгийн дараах мөрүүд нь ажиллаж буй командууд, тэдгүүрийн доорх мөрүүд нь гаралт.

bash -x — script-г debug горимд ажиллуулах

Script-д set -x нэмэхгүйгээр командын мөрөөс debug хийж болно:

bash
# Script-г debug горимд ажиллуулах
bash -x script.sh

# Аргументтай ажиллуулах
bash -x backup.sh /home /backup

# -v тугтай — уншигдсан мөр бүрийг хэвлэнэ (ажиллуулахаас өмнө)
bash -v script.sh

# -xv хоёуланг нэгтгэх
bash -xv script.sh

Script-ийн тодорхой хэсгийг debug хийх

Бүх script-г биш зөвхөн тодорхой хэсгийг debug хийхэд:

bash
#!/bin/bash

echo "Энэ хэсэг нормал ажиллана"

set -x   # Debug эхлэх
result=$(ls /tmp | wc -l)
echo "Tmp файлын тоо: $result"
set +x   # Debug зогсоох

echo "Энэ хэсэг ч нормал ажиллана"

echo ба printf — гараар log бичих

Хялбар боловч маш үр дүнтэй — хаана байгаагаа мэдэхийн тулд:

bash
#!/bin/bash

# Debug функц — DEBUG=1 байвал л хэвлэнэ
debug() {
  if [ "${DEBUG:-0}" = "1" ]; then
    echo "[DEBUG] $*" >&2
  fi
}

# Алдааны функц
log_error() {
  echo "[ERROR $(date '+%H:%M:%S')] $*" >&2
}

log_info() {
  echo "[INFO  $(date '+%H:%M:%S')] $*"
}

# Хэрэглэх
log_info "Script эхэллээ"
debug "Хувьсагчийн утга шалгаж байна"

FILES=$(ls /tmp/*.log 2>/dev/null | wc -l)
debug "Олдсон файлын тоо: $FILES"

if [ "$FILES" -eq 0 ]; then
  log_error "Лог файл олдсонгүй"
  exit 1
fi

log_info "Нийт $FILES лог файл боловсруулагдана"
bash
# Ажиллуулах:
./script.sh            # Зөвхөн INFO, ERROR харагдана
DEBUG=1 ./script.sh    # DEBUG мессежүүд ч харагдана

set -euo pipefail — алдааг эрт илрүүлэх

bash
#!/bin/bash
# Script-ийн эхэнд заавал бичих
set -euo pipefail

# set -e : алдаатай команд → script шууд зогсоно
# set -u : тодорхойлогдоогүй variable → алдаа
# set -o pipefail : pipe-н дундах алдааг ч барина

# Тодорхойлогдоогүй variable-г barих жишээ:
# echo $UNDEFINED_VAR   # → алдаа: unbound variable

shellcheck — автомат шалгалт

shellcheck нь script-ийн алдааг ажиллуулахаасаа өмнө олдог хамгийн хэрэгтэй хэрэгсэл:

bash
# Суулгах
sudo apt install shellcheck   # Ubuntu/Debian
brew install shellcheck        # macOS

# Ашиглах
shellcheck script.sh

# Жишээ анхааруулгууд:
# SC2086: "$VAR" байх ёстой газар $VAR бичсэн (quote дутуу)
# SC2006: `command` биш $(command) ашиглах хэрэгтэй
# SC2164: cd амжилтгүй болоход алдаа зохицуулалт байхгүй
bash
# shellcheck-н гаралтын жишээ
cat > bad.sh << 'EOF'
#!/bin/bash
name=Батболд
echo "Сайн уу, $name !"
cd /tmp/mydir
ls $name
EOF

shellcheck bad.sh
# bad.sh мөр 3: Double quote to prevent globbing and word splitting.
# bad.sh мөр 4: Use 'cd ... || exit' in case cd fails.

LINENO ба BASH_SOURCE — алдааны байршил

bash
#!/bin/bash

# Алдааны мөрийн дугаарыг автоматаар харуулах
trap 'echo "Алдаа гарсан мөр: $LINENO" >&2' ERR

echo "Мөр: $LINENO"   # Одоогийн мөрийн дугаар
echo "Файл: ${BASH_SOURCE[0]}"   # Одоогийн файлын нэр

ls /байхгүй   # Энд алдаа гарна → trap ажиллана

Debug хийх чадвар нь туршлагатай болох тусам сайжирдаг. set -x ба shellcheck хоёрыг л сайн мэдвэл ихэнх алдааг хурдан олж чадна — эдгээрийг заавал цээжилж аваарай.

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

Шилдэг дадлага ба shellcheck — мэргэжлийн Bash script бичих стандарт, нийтлэг алдаанаас сэргийлэх дүрмүүдийг нэгтгэн үзнэ.