私は次のような単純なbashスクリプトを持っています:foo.shこのように:
#!/bin/bash
echo "Foo!"
./foo.sh
メッセージを受信したときに実行すると、Foo!
すべてが正常です。ただし、echo "Foo!"
コンソールから直接移動すると、予想される動作とメッセージが表示されますbash: !": event not found
。
私が知る限り、theは!
前のコマンドでレンダリングされ、pe一重引用符の中で使用されるとリテラルとして扱われます。スクリプトを実行することの違いは何ですかecho "Foo!"
?動作してもsource ./foo.sh
コンソールから直接実行することはありません。
答え1
デフォルトでは、対話型bashシェルは履歴拡張を有効にします(これは動作を制御します!
)。ソースファイル(ほとんどの歴史的拡張の概念の外側にある)とスクリプトはそうではありません。man bash
(またはオンラインマニュアル):
set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
-H
:!
スタイル履歴の交換を有効にします。このオプションは、シェルが対話型の場合にデフォルトで有効になります。
set [+-]H
この動作は、またはを使用して手動で調整できます。set [+-]o histexpand
ここで-H
/-o
作る歴史的拡張と+H
/+o
障害を負うそれ。
たとえば、次を参照してください。