大きな音を出す方法!

大きな音を出す方法!

echoエディタで開かずにファイルに内容を入れてスクリプトを作成してみました。

echo -e "#!/bin/bash \n /usr/bin/command args"  > .scripts/command

これ出力:

bash: !/bin/bash: イベントが見つかりません

私はこの奇妙な行動を以下と比較しました。

$ echo !
!  

$ echo "!"
bash: !: event not found

$ echo \#!
#!

$ echo \#!/bin/bash
bash: !/bin/bash: event not found
  • なぜ爆発が起こるのですか?
  • bashが言う「イベント」とは何ですか?
  • この問題をどのように解決し、「#!/ bin / bash」を画面またはファイルに印刷しますか?

答え1

一重引用符を試してください。

echo -e '#!/bin/bash \n /usr/bin/command args'  > .scripts/command

echo '#!'

echo '#!/bin/bash'

この問題は、bash が履歴から!/bin/bash を検索するために発生します。この動作を防ぐには、単一引用符を使用してください。

答え2

〜のようにリッチ、bashは次のことを試みます。歴史的な試合。これを回避するもう1つの方法は、次のコマンドを使用して爆発を回避することです\

$ echo \#\!/bin/bash
#!/bin/bash

二重引用符は\削除されません。

$ echo "\!"
\!

答え3

!履歴の交換を開始します(「イベント」はコマンド履歴の1行です)。たとえば、含まれている最後のコマンドラインに展開され!lsます。また、特定の単語(たとえば、前のコマンドを参照する最初の単語)を抽出することもできます。詳しくはマニュアルをご覧ください。ls!?foofoo!!:1

この機能は、コマンドラインバージョンがまだプリミティブであるときに以前のコマンドをすばやく呼び出すように設計されています。最新のシェル(少なくともbashとzsh)とコピー&ペーストを使用すると、履歴拡張は以前ほど有用ではありません。まだ便利ですが、それなしで過ごすことができます。

変数を設定して、履歴の置き換えを実行する役割を変更できます。履歴交換をほとんど使用しない場合は、代わりに履歴拡張を実行するように設定することもhistcharsできます。histchars='¡^'¡!set +o histexpand

答え4

次の例では、提案されたソリューションは機能しません。

$ bash -c "echo 'hello World!'"
-bash: !'": event not found
$

この場合、8進数のASCIIコードを使用してバンを印刷できます。

$ bash -c "echo -e 'hello World\0041'"
hello World!
$

関連情報