* add shellcheck # shellcheck shell=bash directive to allow linting
* BP_PIPESTATUS may be unused in function __bp_precmd_invoke_cmd, ignore
* line 174 - SC2086 (info): Double quote to prevent globbing and word splitting.
* line 249 false alarm 'SC1007 (warning): Remove space after = ', added ignore.
* line 294 SC2155 (warning): Declare and assign separately to avoid masking return values.
* line 295 SC2001 (style): See if you can use ${variable//search/replace}. Added ignore
* line 323 SC1087 (error): Use braces when expanding arrays. Disable warning
* fix indentation
* line 249 false alarm 'SC1007 (warning): empty space to '' removed shellcheck directive
Co-authored-by: Adam Price <git@blinvisible.com>
* Return original value from `__bp_precmd_invoke_cmd`
WIthout this change, `__bp_precmd_invoke_cmd` may not restore `$?` to its original value after being run.
Since `__bp_precmd_invoke_cmd` get installed as the first thing in `PROMPT_COMMAND`, this will cause problems if there is an existing `PROMPT_COMMAND` (which is perhaps not aware of `bash-preexec`) that wants to do something with the exit status of the command that was just run.
* Updating tests to allow preserving original exist status for other commands in PROMPT_COMMAND
Co-authored-by: Ryan Caloras <rcaloras@alumni.cmu.edu>
* Remove the underscore prefix of "__bp_imported"
This formally exposes it as part of the public API.
* Fix Bats test after renaming the variable
* Rename the variable upon reviewer request
* Fix inconsistency after renaming variables
Variables were reanmed in 7fbc07fb4e, but
it didn’t cover the test or ReadMe. This commit fixes that.
Since the precmd_functions and preexec_functions arrays won't be actually defined until __bp_install, which is called only during the first $PROMPT_COMMAND, declare empty arrays for these parameters.
This ensures that the shell is aware these things exist, which helps avoud unbound parameters failures in other scripts which depend upon this package.
- Return with an exit code of 1 when run in any shell other than Bash.
Should prevent any functions or variables from being defined. This check
was previously run later during initialization.
- Updated test case for this
- Should address #113
This change allows us to avoid unnecessary command substitutions which are (relatively speaking) quite expensive. Although __bp_sanitize_string is only used during installation __bp_trim_whitespace is invoked in a loop in the critial path as part of __bp_preexec_invoke_exec. Eliminating these subshells will reduce bash-preexec's overhead.
See https://github.com/dimo414/prompt.gem/commit/9764cdb3 for another example of a similar change.
Note: the printf -v syntax was added to Bash in v3.1: https://mywiki.wooledge.org/BashFAQ/061
- Need to update unit tests for echos on both cases
- Small edge case where preexec is not invoked the first time if
PROMPT_COMMAND is appended to after bash-preexec is sourced.
- Handle cases where we append with semicolon and \n
- Relaxes requirement that bash-prexec.sh needs to be included as last
thing in bash_profile.sh
- Preserves existing prompt command in PROMPT_COMMAND variable. May make
sense to still move this to a function in precmd.
- Should address #97 and #39
- Keeps existing traps preserved as preexec functions
- Removes trailing \n on PROMPT_COMMAND added for #58.
In a [`--posix` shell](https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html) (e.g. a shell invoked as `sh` instead of `bash`) the ARG parameter is not optional:
> 41. The trap builtin doesn’t check the first argument for a possible signal specification and revert the signal handling to the original disposition if it is, unless that argument consists solely of digits and is a valid signal number. If users want to reset the handler for a given signal to the original disposition, they should use ‘-’ as the first argument.
It may not be the intent of bash-preexec to actively _support_ POSIX mode, but the failure behavior here is pretty bad:
```
$ bash --noprofile --norc --posix || echo BASH CRASHED
bash-5.0$ source bash_preexec.sh
trap: usage: trap [-lp] [[arg] signal_spec ...]
BASH CRASHED
```
So this small tweak seems worthwhile, even if POSIX mode ends up being problematic for other reasons.
* Using [[ ... ]] on older versions of Bash (e.g. 3.2 on macOS) causes
the test to always pass.
* Include test/README.md that explains the problem and suggests
solutions for future tests.
* Fix use of sed on platforms that don't support \+
Fixes#89.
* Set LC_ALL=C before manipulating strings of numbers.
Thanks @Gnouc for the suggestion in #89.
* upgrade bats version to bats-core 1.1.0
This is necessary for testing with 'nounset'.
* run tests with 'set -o nounset'
Updates tests to run under "nounset" and changes
the code so that the tests pass again.
This resolves#80 .
Tests now pass on both bash 4.3 (travis) and 4.4
(my local). We should probably test multiple
versions of bash at some point.
This uses a sed-based regex instead of the
read builtin to drop the initial number
output by the 'history' command.
The problems with the read builtin are:
- It only reads a single line.
- It strips whitespace.
Changing to this sed expression (which
removes the initial number from the first
line only, assuming that the format of
the history line is "%5d%c %s%s\n" as
in history.def in the bash source code)
resolves both of these issues,
fixing #77 and #78 .
This also removes the need for either an
echo or a printf, and so also incidentally
resolves#76 . (As pointed out on that
issue, this could also have been fixed
without switching to sed.)
Adds regression tests for the fixed issues.
The test code is also adjusted to not have the
same echo/printf issue.
The bash-preexec.sh script is supposed to be sourced into a Bash and
never meant to be run as a standalone script. However, shebangs are
meant as a hint to the program loader to select the proper binary if
executing a text file as if it were one. Thus, the shebang in this
script will never be evaluated and might actually mislead users to
execute instead of source this script. Some distros frown at this.
E.g., openSUSE lints packages for such scripts and generates a warning.
- Fixes bug where IFS in outer environment could be set to something that
would cause our inner functions to break on varibale expansion.
- Added a couple unit tests.
- This was causing crashes in cases where users were doing:
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND;"
- Original description from contributor:
$(trap -p DEBUG)" is launching a sub-shell, bash itself. So when people do
"export PROMPT_COMMAND="history -a; $PROMPT_COMMAND;"", they export form the
parent shell to subsequent sub-shells. And that creates the infinite loop,
that eventually segfault bash.