Como no bash, !
é uma palavra reservada (OK, caractere), ela tem um significado especial em diferentes contextos. Neste caso particular, você está caindo em conflito com sua importância na busca de histórico. De man bash
:
History expansions introduce words from the history list into the input
stream, making it easy to repeat commands, insert the arguments to a
previous command into the current input line, or fix errors in previous
commands quickly.
[...]
History expansions are introduced by
the appearance of the history expansion character, which is ! by
default. Only backslash (\) and single quotes can quote the history
expansion character.
Basicamente, o que isto significa é que o bash pegará os caracteres após o !
e pesquisará seu histórico pelo primeiro comando que encontrar que comece com esses caracteres. É mais fácil demonstrar do que explicar:
$ echo foo
foo
$ !e
echo foo
foo
A expansão do histórico !
ativado, que corresponde ao primeiro comando que começa com e
, que foi a execução anterior echo foo
que foi executada novamente. Então, quando você escreveu "SYNC TIME!"
, o bash viu o !"
, o histórico pesquisado de um comando que começou com "
, falhou e reclamou dele. Você pode obter o mesmo erro executando, por exemplo, !nocommandstartswiththis
.
Para imprimir um ponto de exclamação, você precisa escapar de uma destas duas maneiras:
echo 'Hello world!'
echo Hello world\!