Sobes.tech
Middle

Kaip tvarkote naudotojo klaidas bash?

sobes.tech AI

Atsakymas iš AI

bash'e vartotojų klaidų apdorojimas daugiausia vyksta naudojant:

  • Išeigos kodus: Kiekviena komanda grąžina užbaigimo kodą (exit status). 0 dažniausiai reiškia sėkmę, bet kiti reikšmės — klaidą:
  • Sąlygines konstrukcijas: if, elif, else naudojamos išeigos kodų patikrinimui:
  • Loginiai operatoriai: && (ir), || (ar) leidžia vykdyti komandas priklausomai nuo ankstesnio sėkmės ar nesėkmės:
  • Išeigos nukreipimai: > (stdout), 2> (stderr), &> (stdout ir stderr):
  • Gaudykles (traps): leidžia vykdyti komandą gaunant signalą arba užbaigiant scenarijų:

Pavyzdžiai:

#!/bin/bash

# Išeigos kodo patikrinimas
if ! command_that_might_fail; then
  echo "Klaida vykdant komandą!" >&2 # nukreipimas į stderr
  exit 1 # scenarijaus užbaigimas su klaidos kodu
fi

# Loginis operatorius &&
command_successful && echo "Komanda sėkmingai įvykdyta" || echo "Komanda baigėsi klaida"

# SIGINT (Ctrl+C) gaudyklė
trap 'echo "Gautas signalas. Išeinama..."; exit 1' SIGINT

# Klaidos ir išvesties nukreipimas
if command_with_errors 2> error.log; then
  echo "Komanda įvykdyta be klaidų"
else
  echo "Rasta klaidų. Daugiau informacijos error.log"
fi

Skriptų patikimumo didinimui taip pat naudojami:

  • set -e: Skriptas nutraukiamas po bet kurios nesėkmingos komandos (išskyrus if ir while patikrinimus).
  • set -u: Kintamieji turi būti iš anksto apibrėžti.
  • set -o pipefail: Vamzdžio išeigos kodas tampa paskutinės sėkmingai nesėkmingos komandos kodu:
#!/bin/bash

set -euo pipefail

# Šis scenarijus nutrauks, jei "undefined_var" nebus nustatyta
echo "$undefined_var"

# Šis scenarijus nutrauks, jei "failing_command" grąžins nulinį kodą
failing_command

Funkcijų ir argumentų naudojimas:

#!/bin/bash

# Funkcija su argumentų patikrinimu
validate_args() {
  if [ $# -ne 2 ]; then
    echo "Naudojimas: $0 <argumentas1> <argumentas2>" >&2
    exit 1
  fi
}

validate_args "$@"