Por favor, veja estes comandos:
$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found
$
Os dois primeiros comandos produzem um balão de notificação conforme o esperado. O terceiro dá o erro mostrado.
e
$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
SYNC TIME!
$ echo "SYNC TIME!"
bash: !": event not found
$
Aqui também, os echo
trabalhos para os dois primeiros comandos, mas não para o terceiro.
Mais problemas aqui (embora eu não estivesse planejando usar isso): os dois notify-send "SYNC!TIME"
e echo "SYNC!TIME"
doe bash: !TIME": event not found
.
Mas ambos notify-send
e echo
trabalhar com"SYNC! TIME"
Alguém pode explicar por que o bash: !": event not found
erro aparece?
.bashrc
linhaset +H
. Observe que!
já não é especial em scripts; tratá-lo como especial quebraria muitos scripts em conformidade com os padrões. Ele é tratado apenas como "especial" em shells interativos e somente por padrão até você corrigi-lo. :-)Como no bash,
!
é uma palavra reservada (OK, caractere), ela possui um significado especial em diferentes contextos. Nesse caso em particular, você está afetando sua importância na pesquisa de histórico. Deman bash
:Basicamente, o que isso significa é que o bash pegará os caracteres após o
!
e pesquisará em seu histórico o primeiro comando encontrado, que começa com esses caracteres. É mais fácil demonstrar do que explicar:A
!
expansão do histórico ativado, que correspondeu ao primeiro comando, começando com oe
que foi executado anteriormente,echo foo
que foi executado novamente. Então, quando você escreveu"SYNC TIME!"
, o bash viu!"
, procurou no histórico por um comando começando com"
, falhou e reclamou. Você pode obter o mesmo erro executando, por exemplo!nocommandstartswiththis
.Para imprimir um ponto de exclamação, você precisa escapá-lo de uma destas duas maneiras:
fonte
echo Hello world!
O trabalho --- expansão a história não é desencadeada por espaços em branco ;-) (ah, os casos de canto agradável ...)!
é uma palavra reservada nobash
, como POSIX também declara . Mas tenho certeza de que seu status é completamente independente do seu papel na expansão da história e irrelevante para o tratamento entre aspas duplas.!
é uma palavra reservada porque nega o status de saída de um comando / pipeline, portanto, não pode ser usada como um comando. Nenhuma outra palavra reservada é especial em um"
contexto entre aspas, enquanto não$
é uma palavra reservada, mas é tratada especialmente.