Home > database >  Bash set -e doesn't work as expected(I understand)
Bash set -e doesn't work as expected(I understand)

Time:01-12

#!/bin/bash
set -exuo pipefail

# Run delorean to update the namespaces folder

main() {
  if [ !$(yq -r '.random' file_that_doesnt_exist.yaml) = "true" ]; then
   echo "yes"
  else
   echo "no"
  fi
}

# shellcheck disable=SC2068
main $@

set -e pipefail based on my understanding should exit the bash script on the first occurence of error. However, I get "no" in stdout even though `echo "no" occurs after the error. How does that happen?

CodePudding user response:

set -e stops the script on error, but not always:

The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command's return value is being inverted with !.

(Quote from man bash).

CodePudding user response:

Basically, don't use -e (or at least don't only use that.)
Use a trap, and carefully design your tests with it in mind.

c.f. this whole page for good discussions on alternatives and explanations, and this one for some other examples and elaborations that should give you good inspiration for a better solution.

  •  Tags:  
  • bash
  • Related