Skip to content

Comments

Improve prior_trap processing#170

Merged
rcaloras merged 1 commit intorcaloras:masterfrom
jparise:prior_trap
Aug 3, 2025
Merged

Improve prior_trap processing#170
rcaloras merged 1 commit intorcaloras:masterfrom
jparise:prior_trap

Conversation

@jparise
Copy link
Contributor

@jparise jparise commented Jan 13, 2025

We use trap to bootstrap our installation function (__bp_install). We remove our code upon first execution but need to restore any preexisting trap calls. We previously used sed to process the trap string, but that had two downsides:

  1. sed is an external command dependency. It needs to exist on the system, and we need to invoke it in a subshell (which has some runtime cost).

  2. The regular expression pattern was imperfect and didn't handle trickier cases like ' characters in the trap string:

     $ (trap "echo 'hello'" DEBUG; trap -p DEBUG)
     hello
     trap -- 'echo '\''hello'\''' DEBUG
    

This change removes the dependency on sed by locally evaluating the trap string and extracting any prior trap. This works reliably because we control the format our trap string, which looks like this (with newlines expanded):

__bp_trap_string="$(trap -p DEBUG)"
trap - DEBUG
__bp_install

We use `trap` to bootstrap our installation function (__bp_install). We
remove our code upon first execution but need to restore any preexisting
trap calls. We previously used `sed` to process the trap string, but
that had two downsides:

1. `sed` is an external command dependency. It needs to exist on the
   system, and we need to invoke it in a subshell (which has some
   runtime cost).
2. The regular expression pattern was imperfect and didn't handle
   trickier cases like `'` characters in the trap string:

        $ (trap "echo 'hello'" DEBUG; trap -p DEBUG)
        hello
        trap -- 'echo '\''hello'\''' DEBUG

This change removes the dependency on `sed` by locally evaluating the
trap string and extracting any prior trap. This works reliably because
we control the format our trap string, which looks like this (with
newlines expanded):

    __bp_trap_string="$(trap -p DEBUG)"
    trap - DEBUG
    __bp_install
foo() { (( trap_invoked_count += 1 )); }

# note setting this causes BATS to mis-report the failure line when this test fails
trap "foo && echo 'hello' >/dev/null" debug
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The previous sed-based pattern would fail with more complex cases like this.

mitchellh added a commit to ghostty-org/ghostty that referenced this pull request Jan 16, 2025
We use `trap` to bootstrap our installation function (__bp_install). We
remove our code upon first execution but need to restore any preexisting
trap calls. We previously used `sed` to process the trap string, but
that had two downsides:

1. `sed` is an external command dependency. It needs to exist on the
system, and we need to invoke it in a subshell (which has some runtime
cost).
2. The regular expression pattern was imperfect and didn't handle
trickier cases like `'` characters in the trap string:

        $ (trap "echo 'hello'" DEBUG; trap -p DEBUG)
        hello
        trap -- 'echo '\''hello'\''' DEBUG

This change removes the dependency on `sed` by locally evaluating the
trap string and extracting any prior trap. This works reliably because
we control the format our trap string, which looks like this (with
newlines expanded):

    __bp_trap_string="$(trap -p DEBUG)"
    trap - DEBUG
    __bp_install

Upstream: rcaloras/bash-preexec#170
@jparise
Copy link
Contributor Author

jparise commented Feb 2, 2025

As a proof point, Ghostty 1.1.0 shipped with this change to its bundled bash-preexec, and we haven't heard of any issues through the pre- or post-release period yet.

@rcaloras rcaloras merged commit cf2c1db into rcaloras:master Aug 3, 2025
1 check passed
jparise added a commit to jparise/ghostty that referenced this pull request Aug 3, 2025
https://github.com/rcaloras/bash-preexec/releases/tag/0.6.0

This is a small update for us because we've been using a patched version
of this script in Ghostty for some time, and the 0.6.0 release includes
most of the local changes we made as part of maintaining and improving
our bash shell integration.

- rcaloras/bash-preexec#167
- rcaloras/bash-preexec#170

We continue to maintain one local HISTCONTROL-related modification
(ghostty-org#2478). There are a few upstream conversations related to HISTCONTROL
that might eliminate the need for this local patch, so we may revisit
that in the future.
mitchellh added a commit to ghostty-org/ghostty that referenced this pull request Aug 3, 2025
https://github.com/rcaloras/bash-preexec/releases/tag/0.6.0

This is a small update for us because we've been using a patched version
of this script in Ghostty for some time, and the 0.6.0 release includes
most of the local changes we made as part of maintaining and improving
our bash shell integration.

- rcaloras/bash-preexec#167
- rcaloras/bash-preexec#170

We continue to maintain one local HISTCONTROL-related modification
(#2478). There are a few upstream conversations related to HISTCONTROL
that might eliminate the need for this local patch, so we may revisit
that in the future.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants