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