I took a closer look on this phenomenon after I stumbled over it in two other questions today. I've tried all of this with the default
set -H (history expansion on).
To test a script, I often do things like
echoing a multi-line string and pipe it through a script, but in some cases it gives an error:
$ echo "foo bar" | sed '/foo/!d' bash: !d': event not found >
! seems to trigger history expansion, although it is enclosed with single quotes. The problem seems to be the occurrence of the double quote in the same line, because
$echo $'foo\nbar' | sed '/foo/!d'
works as well as
$echo "foo bar" | > sed '/foo/!d'
My suspicion: History expansion is applied linewise, so the
' after a single
" is considered to be escaped, so the following
! is not escaped.
Now my question: Is this a bug or expected behavior? Reproduced with
bash versions 4.2.30 and 4.4.12.