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

bash

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.

and

$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
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