The following fails and I don't understand why:
$ echo "#!"
the following also fails with the same error message:
$ echo "\#!"
the error message:
-bash: !": event not found
Why does it fail? How should the echo
be done instead?
The following fails and I don't understand why:
$ echo "#!"
the following also fails with the same error message:
$ echo "\#!"
the error message:
-bash: !": event not found
Why does it fail? How should the echo
be done instead?
Another workaround may be to put an extra space after the "!" :
Basically, with double quotes (
"
) aka "weak quoting", Bash does some wacky things with the string, like variable substitution. With single ('
) aka "strong quoting" the string is taken literally.See e.g. here for a more in-depth explanation of quoting.
In my case all commands are working. Maybe you can specify your environment.
By default, bash supports
csh
compatible history-expansion.In bash
will only print a newline, as
#
starts a comment.In
the
#
is part of the string started with"
. Such strings are still inspected by bash for special characters.!
is a special character iff it is followed by any other text.In this case, bash expects the
!"
token to refer to a previous command in shell history starting with"
, and does not find one. All by itself,!
will not trigger this behaviour:Finally,
produces two lines, the first line is printed by the shell to show how the pattern above expands to:
while the second line is just the result of executing the expanded command: echo # !
See Also: The Bash man page on History Expansion
The
!
character is used forcsh
-style history expansion.If you do not use this feature,
set +o histexpand
(akaset +H
) turns off this behavior. It is turned off for scripts, but often enabled for interactive use.As a workaround, you can use single quotes instead of double quotes -- keeping in mind, of course, their different semantics. If you need to combine quoting with variable interpolation, for example, you can change
into
(notice the adjacent single-quoted and double-quoted strings; after the shell is done with this, the quotes will be removed and the string
#!
will be output next to the value of the variableSHELL
with no space between them) or a number of other common workarounds like