shopt extglobを設定するためのスコープ制限は何ですか?と他のオプション?


8

私の非インタラクティブ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)' 

回答:


14

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

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


1
ありがとう。wooledgeのリンクは非常によく、それをカバーしています。いくつかのレガシーな問題のために、それがそのように強化されなければならなかったと思います。
Peter.O 2012

@ Peter.OIは、bashのパーサーが不安定であるため、そのようになっていると言います。もちろん、私は汚い口のzshユーザーですが、これがbashメーリングリストに記載されている公式の理由であることを覚えているようです。Bashには、機能しalias e=echo; e helloないなど、同様の解析問題がたくさんあります。エイリアスの定義は、次の改行でのみ行われます。
Gilles「SO-邪悪なことをやめよ」

面白いですね、ありがとう...いつかzshを見て回ります。それはすべての鐘と笛を持っているようです。非常にコンパクトなもの。
Peter.O 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.