Řešení 1:
!
je speciální znak pro bash, používá se k odkazování na předchozí příkazy; např.
!rm
vyvolá a provede poslední příkaz, který začínal řetězcem "rm" a
!rm:p
vyvolá, ale neprovede poslední příkaz, který začínal řetězcem "rm". bash interpretuje vykřičník v echo "reboot your instance!"
jako "zde nahraďte poslední příkaz, který začínal znaky bezprostředně za vykřičníkem “ a reptá na vás, že nemůže najít událost (příkaz) ve vaší historii, která začala jednou dvojitou uvozovkou.
Zkuste
echo reboot your instance\!
k ochraně (uniknutí) vykřičníku před bash.
Řešení 2:
Nahrazování historie můžete vypnout pomocí set +H
.
Řešení 3:
Chcete-li vyřešit svůj původní problém, zkuste použít jednoduché uvozovky, nikoli dvojité. V druhém případě se bash pokusí rozšířit určité znaky před předáním výsledku příkazu (v tomto případě echo). S jednoduchými uvozovkami bash předá celý řetězec beze změny.
!
se používá v příkazech k odkazování na historii příkazového řádku. Viz:http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS pro celou sadu. Ve výše uvedeném příkladu se bash pokouší rozšířit !"
jako odkaz na událost předtím, než se echo dostane dovnitř, proto chyba.
Všimněte si, že ve skriptech všechny z příkazů historie jsou zakázány, protože mají smysl pouze v interaktivním prostředí.
Jediný, který používám pravidelně, je !$
. Rozbalí se na poslední argument předchozího příkazu. Místy je to užitečná zkratka.
Řešení 4:
Jednoduše vložte mezeru mezi !
a "
než to bude fungovat.
Řešení 5:
Ano, ! je speciální znak pro bash, používá se k odkazování na předchozí příkazy.
Několik způsobů, jak můžete situaci zvládnout
Následující vypíše řetězec tak, jak je
echo 'Reboot your instance!'
Následující příkaz provede a zřetězí řetězec
echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`