!
コマンドライン履歴のコンテキストでコマンドラインに特別な意味があることを認識していますが、それ以外に、実行スクリプトでは感嘆符が解析エラーを引き起こすことがあります。
私はそれが何かに関係していると思いますevent
が、私はイベントが何であるか、それが何をするのか分かりません。それでも、同じコマンドは異なる状況で異なる動作をする可能性があります。
以下の最後の例では、エラーが発生します。しかし、なぜ、同じコードがコマンド置換の外側で機能したのですか?.. GNU bash 4.1.5を使用する
# This works, with or without a space between ! and p
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar
# This works, works when there is a space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar
# This causes an ERROR, with NO space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
# bash: !p': event not found
protected
。(「単一引用符」で保護されています)
var=$(…)
(二重引用符なしで)使用できます。これは期待どおり(と思う)に動作します。(これは、例えば(組み込みコマンドを介して行わ割り当ての真実ではないかもしれないが、単純な代入の値の一部が単語分割の対象ではありませんかグロブので、これはまだ「安全」でexport
、local
すべてのシェルの下で)、など)。残念ながら、これは単純な割り当てを超えて拡張されません。二重引用符は、他のコンテキストで他のタイプの拡張を取得しながら、単語の分割やグロビングから保護する方法だからです。