Sobes.tech
Middle

Hoe ga je om met gebruikersfouten in bash?

sobes.tech AI

Antwoord van AI

In bash worden gebruikersfouten voornamelijk afgehandeld met:

  • Uitgangscodes van commando's: Elk commando geeft een afsluitcode (exit status) terug. 0 betekent meestal succes, elke andere waarde duidt op een fout.
  • Voorwaardelijke constructies: if, elif, else worden gebruikt om de uitkomstcodes te controleren.
  • Logische operatoren: && (en), || (of) maken het mogelijk om commando's uit te voeren afhankelijk van het succes of falen van eerdere commando's.
  • Output omleiding: > (stdout), 2> (stderr), &> (stdout en stderr).
  • Vallen (traps): Hiermee kan een commando worden uitgevoerd bij ontvangst van een signaal of bij het beëindigen van een script.

Voorbeelden:

#!/bin/bash

# Controleer de uitkomstcode
if ! command_that_might_fail; then
  echo "Fout bij het uitvoeren van het commando!" >&2 # Omleiding naar stderr
  exit 1 # Beëindig het script met een foutcode
fi

# Logisch operator &&
command_successful && echo "Commando succesvol uitgevoerd" || echo "Commando eindigde met een fout"

# Trap voor SIGINT (Ctrl+C)
trap 'echo "Signaal ontvangen. Afsluiten..."; exit 1' SIGINT

# Omleiding van fouten en bericht
if command_with_errors 2> error.log; then
  echo "Commando zonder fouten uitgevoerd"
else
  echo "Fouten gedetecteerd. Details in error.log"
fi

Om de betrouwbaarheid van scripts te verhogen, worden ook gebruikt:

  • set -e: Het script stopt bij elke mislukte opdracht (behalve in if en while).
  • set -u: Variabelen moeten worden gedefinieerd voordat ze worden gebruikt.
  • set -o pipefail: De uitkomstcode van een pijplijn wordt die van de laatste mislukte opdracht.
#!/bin/bash

set -euo pipefail

# Dit script stopt als "undefined_var" niet is ingesteld
echo "$undefined_var"

# Dit script stopt als "failing_command" een niet-nul uitkomstcode geeft
failing_command

Gebruik van functies en argumenten:

#!/bin/bash

# Functie met argumentcontrole
validate_args() {
  if [ $# -ne 2 ]; then
    echo "Gebruik: $0 <argument1> <argument2>" >&2
    exit 1
  fi
}

validate_args "$@"