解決策 1:
!
は bash の特殊文字で、前のコマンドを参照するために使用されます。例:
!rm
文字列「rm」で始まる最後のコマンドを呼び出して実行し、
!rm:p
文字列「rm」で始まる最後のコマンドを呼び出しますが、実行はしません。 bash は echo "reboot your instance!"
の感嘆符を解釈しています as "感嘆符の直後の文字で始まる最後のコマンドをここで置き換えます
試す
echo reboot your instance\!
感嘆符を bash から保護 (エスケープ) します。
解決策 2:
set +H
を使用して履歴置換をオフにすることができます .
解決策 3:
元の問題を解決するには、二重引用符ではなく単一引用符を使用してみてください。後者の場合、bash は結果をコマンド (この場合は echo) に渡す前に、特定の文字を展開しようとします。一重引用符を使用すると、bash は文字列全体を変更せずに渡します。
!
コマンドライン履歴を参照するためにコマンドで使用されます。完全なセットについては、http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS を参照してください。上記の例では、bash は !"
を展開しようとしています。 echo が検索される前のイベントへの参照として、エラーが発生します。
スクリプトでは、すべて インタラクティブシェルでのみ意味があるため、履歴コマンドの一部は無効になっています。
私が定期的に使用しているのは !$
だけです .前のコマンドの最後の引数に展開されます。場所によっては便利な略記です。
解決策 4:
!
の間にスペースを入れるだけです と "
解決策 5:
はい、 !は bash の特殊文字で、前のコマンドを参照するために使用されます。
状況に対処する方法のいくつか
以下は文字列をそのまま出力します
echo 'Reboot your instance!'
以下はコマンドを実行し、文字列を連結します
echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`