Bashスクリプトの感嘆符と端末の感嘆符

Bashスクリプトの感嘆符と端末の感嘆符

私は次のような単純な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 障害を負うそれ。

たとえば、次を参照してください。

関連情報