this post was submitted on 15 Jan 2025
567 points (98.5% liked)
linuxmemes
21826 readers
1285 users here now
Hint: :q!
Sister communities:
Community rules (click to expand)
1. Follow the site-wide rules
- Instance-wide TOS: https://legal.lemmy.world/tos/
- Lemmy code of conduct: https://join-lemmy.org/docs/code_of_conduct.html
2. Be civil
- Understand the difference between a joke and an insult.
- Do not harrass or attack members of the community for any reason.
- Leave remarks of "peasantry" to the PCMR community. If you dislike an OS/service/application, attack the thing you dislike, not the individuals who use it. Some people may not have a choice.
- Bigotry will not be tolerated.
- These rules are somewhat loosened when the subject is a public figure. Still, do not attack their person or incite harrassment.
3. Post Linux-related content
- Including Unix and BSD.
- Non-Linux content is acceptable as long as it makes a reference to Linux. For example, the poorly made mockery of
sudo
in Windows. - No porn. Even if you watch it on a Linux machine.
4. No recent reposts
- Everybody uses Arch btw, can't quit Vim, <loves/tolerates/hates> systemd, and wants to interject for a moment. You can stop now.
Please report posts and comments that break these rules!
Important: never execute code or follow advice that you don't understand or can't verify, especially here. The word of the day is credibility. This is a meme community -- even the most helpful comments might just be shitposts that can damage your system. Be aware, be smart, don't fork-bomb your computer.
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
Putting
or die “blah blah”
after every line in your script seems much less elegant than op’s solutionThe issue with
set -e
is that it's hideously broken and inconsistent. Let me copy the examples from the wiki I linked.Or, "so you think set -e is OK, huh?"
Exercise 1: why doesn't this example print anything?
Exercise 2: why does this one sometimes appear to work? In which versions of bash does it work, and in which versions does it fail?
Exercise 3: why aren't these two scripts identical?
Exercise 4: why aren't these two scripts identical?
Exercise 5: under what conditions will this fail?
And now, back to your regularly scheduled comment reply.
set -e
would absolutely be more elegant if it worked in a way that was easy to understand. I would be shouting its praises from my rooftop if it could make Bash into less of a pile of flaming plop. Unfortunately ,set -e
is, by necessity, a labyrinthian mess of fucked up hacks.Let me leave you with a allegory about
set -e
copied directly from that same wiki page. It's too long for me to post it in this comment, so I'll respond to myself.Woah, that
((i++))
triggered a memory I forgot about. I spent hours trying to figure out what fucked up my$?
one day.When I finally figured it out: "You've got to be kidding me."
When i fixed with
((++i))
: "SERIOUSLY! WTAF Bash!"From https://mywiki.wooledge.org/BashFAQ/105
This is great and thanks for taking the time to enlighten us 😄
No worries! Bash was my first language, and I still unaccountably love it after 15 years. I hate it and say mean things about it, but I'm usually pleased when I get to write some serious Bash.
Exercise 6:
That one was fun to learn.
Even with all the jank and unreliability, I think
set -e
does still have some value as a last resort for preventing unfortunate accidents. As long as you don't use it for implicit control flow, it usually (exercise 6 notwithstanding) does what it needs to do and fails early when some command unexpectedly returns an error.I personally don't believe there's a case for it in the scripts I write, but I've spent years building the
|| die
habit to the point where I don't even think about it as I'm writing. I'll probably edit my post to be a little less absolute, now that I'm awake and have some caffeine in me.One other benefit I forgot to mention to explicit error handling is that you get to actually log a useful error message. Being able to
rg 'failed to scrozzle foo.* because service y was not available'
and immediately find the exact line in the script that failed is so nice. It's not quite a stack trace with line numbers, but it's much nicer than what you have with bash by default or with set -e.