私の非対話型bashシェルにはextglob off
があります。コマンドの直前のステートメントでオンにしたいのですが、shopt -s extglob
がif .. then .. else
ブロック内にあると、どういうわけか登録されないことに気づきました。
次のextglob-dependantコマンドは無効です:syntax error near unexpected token '('
。
extglob
はどこに設定できますか?また、なぜ制限があるのですか?これは他のオプションにも当てはまりますか? ... GNU bash 4.1.5
これは機能します:
shopt -s extglob
if true ;then
touch a.bcd; ls a.@(bcd)
fi
これは失敗します:
if true ;then
shopt -s extglob
touch a.bcd; ls a.@(bcd)
fi
... line 17: syntax error near unexpected token `('
... line 17: `touch a.bcd; ls a.@(bcd)'
この問題に関するより信頼できる情報源(つまり、manページ/公式ドキュメント)があるかどうかはわかりませんが、この動作を説明するサイトを見つけました: http://mywiki.wooledge.org/glob
Extglobオプションは特定の文字の解析方法を変更するため、shoptコマンドと拡張globを使用する後続のコマンドの間に改行(セミコロンだけでなく)を含める必要があります。同様に、拡張グロブを使用するステートメントブロック内にshopt -s extglobを配置することはできません。これは、ブロックを定義するときにブロック全体を解析する必要があるためです。 shoptコマンドは、ブロックが評価されるまで有効になりません。評価される時点では手遅れです。実際、bashはステートメントブロック全体を解析してから評価するため、extglobを最も外側のブロックの外側に設定する必要があります。