you are viewing a single comment's thread
view the rest of the comments
[–] 13 points 8 months ago (13 children)

As you'll learn later in this blogpost, there are some footguns and caveats you'll need to keep in mind when using -e.

I am so glad this article is not following blind recommendations, as lot of people usually do. It's better to handle the error, instead closing the script that caused the error. I think the option -e should be avoided by default, unless there is a really good reason to use it.

  • source
  • hideshow 13 child comments
  • [–] 11 points 8 months ago (11 children)

    The point of using -e is that it forces you to handle the error, or even be aware that there is one.

  • source
  • parent
  • hideshow 11 child comments
  • [–] 7 points 8 months ago (1 child)

    Errors in command substitution e.g. $(cat file) are ignored by 'set -e', one example of its confusing nature. It does not force you to all handle errors, just some errors and which ones depends on the code you write.

    https://mywiki.wooledge.org/BashPitfalls#set_-euo_pipefail

  • source
  • parent
  • hideshow 1 child comment
  • [–] 4 points 8 months ago* (last edited 8 months ago)

    This is a great article. I just want to highlight this insane behavior in particular (slightly dramatized):

    set -e
    
    safeDelete() {
      false
    
      # Surely we don't reach this, right?
      echo "rm $@ goes brr..."
    }
    
    if safeDelete all of my files; then
        : # do more stuff
    fi
    

    Frankly if you actually need robustness (which is not always), you should be using a real programming language with exceptions or result types or both (i.e. not C). UNIX processes are just not really up to the task.

  • source
  • parent
  • [–] 10 points 8 months ago (8 children)

    In my experience this option is too risky. Making simple changes to the script without scientifically proofing and testing it works under all cases becomes impossible (depending on how complex the script and task itself is). It has a bit of the energy of "well you have to make no errors in C, then you can write good code and it never fails".

    This option is good if the script MUST fail under any circumstances, if any error return of a program occurs. Which is usually not the case for most scripts. It's also useful in testing when debugging or when developing. Also useful if you purposefully enable and disable the option on the fly for sensitive segments of the script. I do not like this option as a default.

  • source
  • parent
  • hideshow 8 child comments
  • [–] 10 points 8 months ago (4 children)

    I don't have the Bash experience to argue against that, but from a general programming experience, I want things to crash as loudly as possible when anything unexpected happens. Otherwise, you might never spot it failing.

    Well, and nevermind that it could genuinely break things, if an intermediate step fails, but it continues running.

  • source
  • parent
  • hideshow 4 child comments
  • [–] 6 points 8 months ago* (2 children)

    Bash and the commandline are designed to work after an error. I don't want it to fail after an error. It depends on the error though, and how critical it is. And this option makes no distinction. There are lot of commands where a fail is part of normal execution. As I said before, this option can be helpful when developing, but I do not want it in production. Often "silent" fails are a good thing (but as said, it depends on the type). The entire language is designed to sometimes fail and keep working as intended.

    You really can't compare Bash to a normal programming language, because the language is contained and developed in itself. While Bash relies on random and unrelated applications. That's why I do not like comparisons like that.

    Edit: I do do not want to exit the script on random error codes, but maybe handle the error. With that option in place, I have to make sure an error never happens. Which is not what I want.

  • source
  • parent
  • hideshow 2 child comments
  • [–] 6 points 8 months ago*

    Often "silent" fails are a good thing

    Silent fails have caused me to waste many hours of my time trying to figure out what the fuck was happening with a simple script. I've been using -e on nearly all bash code I've written for years - with the exception of sourced ones - and wouldn't go back.

    If an unhandled error happened, I want my program to crash so I can evaluate whether I need to ignore it, or actually handle it.

  • source
  • parent
  • [–] 5 points 8 months ago

    But you can just as well make an exception to allow errors when -e is enabled with something like command || true, or even some warning message.

    I feel like, while it does occur, allowing errors like this is more unusual than stopping the script in an error, so it's good to explicitly mark this case, therefore -e is still a reasonable default in most cases.

  • source
  • parent
  • [+] 4 points 8 months ago (1 child)
  • [–] 2 points 8 months ago

    I do not want to think about every possible error that can happen. I do not want to study every program I call to look for any possible errors. Only errors that are important to my task.

    As I said, there are reasons to use this option when the script MUST fail on error.And its helpful for creating the script. I just don't like generalizations to always enable this option.

  • source
  • parent