shopt extglob設定の範囲制限は何ですか?そして他のオプションは?

shopt extglob設定の範囲制限は何ですか?そして他のオプションは?

私の非対話型bashシェルにはextglob offshopt -s extglobif .. then .. else

次のようなextglobによって異なります無効なコマンド:syntax error near unexpected token '('

どこで設定でき、extglobなぜ制限がありますか?他のオプションにも適用されますか? ...GNU バッシュ 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)' 

答え1

この問題についてより権威のある情報源(マニュアルページ/公式文書)があるかどうかはわかりませんが、この動作を説明するWebサイトを見つけました。http://mywiki.wooledge.org/glob

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

関連情報