Watch someone backspace 40 characters instead of pressing CTRL+W, and you’ll understand why this list exists. A collection of shell tricks-grouped by what works everywhere and what’s Bash/Zsh-speci...
set -e: Exit on error. Very useful, but notoriously weird with edge cases (especially inside conditionals like if statements, while loops, and pipelines). Don’t rely on it blindly as it can create false confidence. (Pro-tip: consider set -euo pipefail for a more robust safety net, but learn its caveats first.)
while I appreciate that the author mentions how weird this is, nobody is going to learn all the caveats correctly. Don’t use set -e. Don’t use set -e. Don’t use set -e. It’s a shit ass broken ass fucked feature that half of nobody understands well. Here’s a great wiki page explaining why it’s trash: https://mywiki.wooledge.org/BashFAQ/105
People like Go, and Go requires you to manually and stupidly handle every possible error case. Why not do the same for shell? It’s really quite easy:
#!/usr/bin/env bashechoerr() { echo"$@" 1>&2; }
die() {
message="$1"; shift
exit_code="${1:-1}"
echoerr "$message"exit"$exit_code"
}
temp_dir="$HOME/tmp"mkdir -p "$temp_dir" || die "Failed to make persistent temporary dir $temp_dir"
lc_dir="$(mktemp -d -p "$temp_dir")" || die "Failed to make target dir in $temp_dir"
Look at that, descriptive error messages! And it doesn’t depend on a shell feature that is inconsistent between versions with no good documentation about all of the fucked up caveats.
while I appreciate that the author mentions how weird this is, nobody is going to learn all the caveats correctly. Don’t use
set -e. Don’t useset -e. Don’t useset -e. It’s a shit ass broken ass fucked feature that half of nobody understands well. Here’s a great wiki page explaining why it’s trash: https://mywiki.wooledge.org/BashFAQ/105People like Go, and Go requires you to manually and stupidly handle every possible error case. Why not do the same for shell? It’s really quite easy:
#!/usr/bin/env bash echoerr() { echo "$@" 1>&2; } die() { message="$1"; shift exit_code="${1:-1}" echoerr "$message" exit "$exit_code" } temp_dir="$HOME/tmp" mkdir -p "$temp_dir" || die "Failed to make persistent temporary dir $temp_dir" lc_dir="$(mktemp -d -p "$temp_dir")" || die "Failed to make target dir in $temp_dir"Look at that, descriptive error messages! And it doesn’t depend on a shell feature that is inconsistent between versions with no good documentation about all of the fucked up caveats.