web-dev-qa-db-ja.com

shoptextglobを設定するためのスコープ制限は何ですか。および他のオプション?

私の非対話型bashシェルにはextglob offがあります。コマンドの直前のステートメントでオンにしたいのですが、shopt -s extglobif .. 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)' 
8
Peter.O

この問題に関するより信頼できる情報源(つまり、manページ/公式ドキュメント)があるかどうかはわかりませんが、この動作を説明するサイトを見つけました: http://mywiki.wooledge.org/glob

Extglobオプションは特定の文字の解析方法を変更するため、shoptコマンドと拡張globを使用する後続のコマンドの間に改行(セミコロンだけでなく)を含める必要があります。同様に、拡張グロブを使用するステートメントブロック内にshopt -s extglobを配置することはできません。これは、ブロックを定義するときにブロック全体を解析する必要があるためです。 shoptコマンドは、ブロックが評価されるまで有効になりません。評価される時点では手遅れです。実際、bashはステートメントブロック全体を解析してから評価するため、extglobを最も外側のブロックの外側に設定する必要があります。

14
lk-