私の非対話型bashシェルにはextglob off
。shopt -s extglob
if .. 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を設定する必要があります。