Skip to content

Instantly share code, notes, and snippets.

@cbugk
Forked from phemmer/defer.sh
Created March 5, 2024 09:55
Show Gist options
  • Select an option

  • Save cbugk/4424ac68477c5dd509ac6c5bd39a7fa0 to your computer and use it in GitHub Desktop.

Select an option

Save cbugk/4424ac68477c5dd509ac6c5bd39a7fa0 to your computer and use it in GitHub Desktop.
bash defer function - just like go's defer()
if [[ -z "$BASHPID" ]]; then
echo "your bash is too old" >&2
exit 1
fi
deferred=()
deferred_pid=
run_deferred() {
if [[ "$deferred_pid" != $BASHPID ]]; then
# we are a subshell, don't execute statements created in parent
return
fi
set +e
for (( i=${#deferred[@]} - 1; i >= 0; i-- )); do
eval "${deferred[i]}"
done
}
defer1() {
if [[ "$deferred_pid" != $BASHPID ]]; then
# $deferred was inherited from a parent (we are a subshell). re-initialize it
deferred=()
deferred_pid=$BASHPID
trap run_deferred EXIT
fi
deferred+=( "$1" )
}
defer() {
defer1 "$(printf '%q ' "$@")"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment