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 "Հրամանը ավարտվեց սխալով"

# Սխալի բռնիչ (trap) 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 "$@"