Soluzione 1:
!
è un carattere speciale per bash, è usato per fare riferimento a comandi precedenti; ad esempio,
!rm
richiamerà ed eseguirà l'ultimo comando che iniziava con la stringa "rm", e
!rm:p
richiamerà ma non eseguirà l'ultimo comando che iniziava con la stringa "rm". bash interpreta il punto esclamativo in echo "reboot your instance!"
come "sostituisci qui l'ultimo comando che inizia con il carattere o i caratteri immediatamente successivi al punto esclamativo ", e ti brontola dicendoti che non riesce a trovare un evento (comando) nella tua storia che sia iniziato con una singola doppia virgoletta.
Prova
echo reboot your instance\!
per proteggere (fuggire) il punto esclamativo da bash.
Soluzione 2:
Puoi disattivare la sostituzione della cronologia utilizzando set +H
.
Soluzione 3:
Per risolvere il tuo problema originale, prova a utilizzare le virgolette singole anziché le virgolette doppie. Con quest'ultimo, bash tenterà di espandere alcuni caratteri prima di passare il risultato al comando (echo in questo caso). Con le virgolette singole, bash passa l'intera stringa, senza modifiche.
!
viene utilizzato nei comandi per fare riferimento alla cronologia della riga di comando. Vedere:http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS per una serie completa. Con l'esempio precedente, bash sta tentando di espandere !"
come riferimento a un evento prima che echo dia un'occhiata, da qui l'errore.
Nota che negli script, all dei comandi della cronologia sono disabilitati, poiché hanno senso solo in una shell interattiva.
L'unico che uso regolarmente è !$
. Si espande fino all'ultimo argomento del comando precedente. È una scorciatoia utile in alcuni punti.
Soluzione 4:
Basta inserire uno spazio tra !
e "
di quanto funzionerà.
Soluzione 5:
Sì, ! è un carattere speciale per bash, è usato per riferirsi ai comandi precedenti.
Pochi modi in cui puoi gestire la situazione
Quanto segue restituirà la stringa così com'è
echo 'Reboot your instance!'
Quanto segue eseguirà il comando e concatenerà la stringa
echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`