Tente executar o seguinte em um shell bashecho "Reboot your instance!"
Na minha instalação:
root@domU-12-31-39-04-11-83:/usr/local/bin# bash --version
GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@domU-12-31-39-04-11-83:/usr/local/bin# uname -a
Linux domU-12-31-39-04-11-83 2.6.35-22-virtual #35-Ubuntu SMP Sat Oct 16 23:57:40 UTC 2010 i686 GNU/Linux
root@domU-12-31-39-04-11-83:/usr/local/bin# echo "Reboot your instance!"
-bash: !": event not found
Alguém pode explicar o que é "eventos bash?" Eu nunca ouvi esse conceito antes. Além disso, como devo produzir "!" no final da frase?
!
é um caractere especial para bash, é usado para se referir a comandos anteriores; por exemplo,irá recuperar e executar o último comando que começou com a string "rm", e
irá recuperar, mas não executará o último comando que começou com a string "rm". bash está interpretando o ponto de exclamação
echo "reboot your instance!"
como " substitua aqui o último comando que começou com o(s) caractere(s) imediatamente após o ponto de exclamação ", e resmunga para você que não pode encontrar um evento (comando) em seu histórico que começou com um único citação dupla.Tentar
para proteger (escape) o ponto de exclamação do bash.
Você pode desativar a substituição do histórico usando
set +H
.Para resolver seu problema original, tente usar aspas simples, em vez de aspas duplas. Com o último, o bash tentará expandir certos caracteres antes de passar o resultado para o comando (echo neste caso). Com aspas simples, o bash passa a string inteira, inalterada.
!
é usado em comandos para se referir ao histórico da linha de comando. Consulte: http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS para obter um conjunto completo. Com o exemplo acima, o bash está tentando expandir!"
como uma referência a um evento antes que o echo dê uma olhada, daí o erro.Observe que em scripts, todos os comandos de histórico são desabilitados, pois só fazem sentido em um shell interativo.
O único que uso regularmente é o
!$
. Ele se expande para o último argumento do comando anterior. É uma abreviação útil em alguns lugares.Basta colocar um espaço entre
!
e"
do que vai funcionar.Sim, ! é um caractere especial para bash, é usado para se referir a comandos anteriores.
Algumas das maneiras pelas quais você pode lidar com a situação
O seguinte produzirá a string como está
O seguinte irá executar o comando e concatenar a string
Você também pode adicionar
In
./bash_profile
(ou use-o como uma vez na linha de comando)Para desabilitar
!
de ser um 'char de histórico especial', ou configurá-lo para outra coisa.Aviso ; algumas coisas podem quebrar quando você a configura, por exemplo, para
~
e possivelmente outras strings.Olhar:
Você também pode usar um heredoc :
É irritante neste caso porque não é uma linha, mas para comandos mais longos (como escrever um script bash), funciona muito bem.
Parece
bash 4.3
que você não precisa mais usar aspas simples ouset +H
:!
é um caractere especial para zsh. Ele aponta para o comando anterior.Se você precisar usá-lo como caractere de string, tente
\!
escapar disso:
echo reboot your instance\!
E se você se deparar com algo quando precisar usar duas Exclamações, use:
ls *[\!'!']*