Ubuntu – Why does exclamation mark within double quotes cause a Bash error


Please look at these commands:

$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found

The first two commands produce a notification bubble as expected. The third gives the error shown.


$ echo SYNC TIME!
$ echo 'SYNC TIME!'
$ echo "SYNC TIME!"
bash: !": event not found

Here as well, the echo works for first two commands but not in the third.

More problems here (although I was not planning on using this): both notify-send "SYNC!TIME" and echo "SYNC!TIME" give bash: !TIME": event not found.

But both notify-send and echo work with "SYNC! TIME"

Can someone please explain why the bash: !": event not found error appears?

Best Answer

! is the default history expansion character in Bash, see the section "HISTORY EXPANSION" in the Bash manpage

  • History expansion doesn't take place if the ! is enclosed by single quotes, as in

    notify-send 'SYNC TIME!'
  • History expansion doesn't take place if the ! is followed by a space, tab, newline, carriage return, or =, as in

    notify-send SYNC TIME!
  • History expansion does take place in

    echo "SYNC TIME!"

    So you'll get an error if there isn't a command starting with " in your history