web-dev-qa-db-ja.com

「-bash:!」とは:イベントが見つかりません "

Bash Shellの下で次のコマンドを実行してみてくださいecho "Reboot your instance!"

私のインストールでは:

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

誰でも「バッシュイベント」とは何か説明してもらえますか?この概念を聞いたことがありません。また、「!」の出力方法は?文の終わりに?

123
Maxim Veksler

set +Hを使用して、履歴の置換をオフにできます。

!はbashの特殊文字で、前のコマンドを参照するために使用されます。例えば、

!rm

文字列「rm」で始まる最後のコマンドを呼び出して実行します。

!rm:p

文字列「rm」で始まる最後のコマンドを呼び出しますが、実行はしません。 bashはecho "reboot your instance!"内の感嘆符を「ここでは感嘆符の直後の文字で始まる最後のコマンドに置き換えてください」と解釈しているため、単一の二重引用符で始まった履歴内のイベント(コマンド)。

試す

echo reboot your instance\!

感嘆符をbashから保護(エスケープ)するため。

111
MadHatter

元の問題を解決するには、二重引用符ではなく単一引用符を使用してみてください。後者の場合、bashは結果をコマンド(この場合はエコー)に渡す前に特定の文字を展開しようとします。一重引用符を使用すると、bashは文字列全体を変更せずに渡します。

!は、コマンドライン履歴を参照するためにコマンドで使用されます。完全なセットについては、 http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS を参照してください。上記の例では、bashは!"をイベントへの参照として展開しようとしています。これは、echoが検索する前に行われるため、エラーになります。

スクリプトでは、履歴コマンドのallは無効になっていることに注意してください。これらは対話型シェルでのみ意味があるためです。

私が定期的に使用しているのは!$だけです。前のコマンドの最後の引数に展開されます。これは、場所によっては便利な短縮形です。

27
SmallClanger

間にスペースを入れるだけ!そして、それはうまくいくでしょう。

乾杯。

6
Isik Mater

はい、 ! bashの特殊文字です。前のコマンドを参照するために使用されます。

あなたが状況に対処できるいくつかの方法

以下は文字列をそのまま出力します

echo 'Reboot your instance!'

以下はコマンドを実行して文字列を連結します

echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`
2
Syed Qaiser

heredoc を使用することもできます:

cat <<EOF
Reboot your instance!
EOF

ワンライナーではないため、この場合は煩わしいですが、より長いコマンド(bashスクリプトの作成など)の場合は、うまく機能します。

0
Tom Saleeba

追加することもできます

histchars=  

./bash_profile内(またはコマンドラインで1回限りの使用)

!が「特別な履歴文字」になることを無効にするか、または別の文字に設定します。

警告;たとえば~や他の文字列に設定すると、壊れることがあります。

見て:

$ echo "!test"
-bash: !test: event not found
$ histchars=
$ echo "!test"
!test
$ histchars=7
$ echo "7test"
-bash: 7test: event not found
$ histchars=
$ histchars=~
$ histchars=
hars=hars=~     # odd output
$ ~/test
-bash: /test: event not found
0

bash 4.3では、単一引用符またはset +Hを使用する必要がなくなったようです。

$ bash --version
GNU bash, version 4.3.46(1)-release (x86_64-unknown-linux-gnu)
[...]
$ echo "Reboot your instance!"
Reboot your instance!
0
Eugene Yarmash