Haha, apologies. Ignore the above for the moment. I'm in the process of submitting a bugfix, and I was just testing bashbug locally with some dummy data, intending to send the email to myself.
Accidentally sent it to you before I was ready. Actual email coming soon. :) -Jason On Fri, Jan 2, 2026 at 3:20 PM <[email protected]> wrote: > Configuration Information [Automatically generated, do not change]: > Machine: The Book > OS: linux-gnu > Compiler: gcc > Compilation CFLAGS: -g -O2 > Phonetic CFLAGS: /ˈɡoʊ.to <http://xn--6oa.to>ʊ/ > uname output: Sudocode 1.0.0-aleph-0 λογ-OS ϺΜΠ PREEMPT_DYNAMIC ευ-Fri > 08:21 ευTC 20XY Bk GNU/Linux > > Bash Version: latest > Patch Level: 0 > Release Status: release > > Description: > > Fix interaction between shell history and case-in-comsub > > In interactive mode, the following lines all behave > as expected. That is, they do not cause history expansion, > and they each execute without printing to stderr. > > 1. echo $(if true; then echo 'hi!'; fi) > 2. echo $(if false; then echo 'hi!'; fi) > 3. echo "$(if true; then echo 'hi!'; fi)" > 4. echo "$(if false; then echo 'hi!'; fi)" > 5. echo $(case a in a) echo 'hi!';; esac) > 6. echo $(case a in b) echo 'hi!';; esac) > > The same correct (lack of) behavior is observed for all other > forms of conditional, whether the condition is true or false, > and whether the outer comsub is double quoted or not quoted. > (e.g., for, while, until, [[ ]] && { }, [ ] || { }, etc.) > > However, in cases of the following form: > > 7. echo "$(case a in a) echo 'hi!';; esac)" > 8. echo "$(case a in b) echo 'hi!';; esac)" > > we get the following output, even in cases for which the > enclosing case pattern is false. > > > bash: !': event not found > > Commands of the above form may print other strings, depending > on the contents of the shell's history. > > This commit provides a simple first draft of a fix in subst.c, > and adds the file tests/comsub28.sub to verify that history > expansion in single quotes no longer occurs in these contexts. > > Limitations: > * The current fix does not attempt to address arbitrarily nested > case statements inside comsubs. A more complete fix to this > problem would be better handled by someone with more familiarity > with the codebase (e.g. Chet, if he thinks it's worth the time.) > * Another reason for not pursuing a more general fix at the moment > is that I'm not sure whether this bug is a symptom of a more > general problem in the parser related to case stmts inside comsubs. > I mention this only because I fixed a similar bug back in 2020 > related to SEMI_SEMI_AND inside of case statements within comsubs, > which I never got around to submitting and which was eventually > fixed. Since this is the second time I've encountered $(case) > related bugs, I decided to keep the fix simple for now, since I'm > not sure if this fix is just addressing a symptom and not the cause. > > I'm by no means an expert on the code base, so apologies in > advance for any glaringly obvious errors or bad decisions. > > Repeat-By: > > echo "$(case a in b) echo 'hi!';; esac)" > > Fix: > > Current version of the fix uses a simple heuristic check > (to see if we're inside a `case` statement) to the function > `skip_to_histexp` in the file `subst.c`. > >
