Re: A Bug in History

Jason Wilkes <[email protected]>
Newsgroups gmane.comp.shells.bash.bugs
Message-ID <CAFKz9Wa01379ijT4VWNSNc1ps9Qd7HYmV=+jFwmZk2+5mABWHw@mail.gmail.com>
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`.
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.