私たちの関心をbash
、この回答Stack Overflow に関する次のレポートがあります。
extglob
使用されるマークですパーサーで。関数、複合コマンドなど、実行前に完全に解析されました。したがって、extglob
コンテンツが解析される前に設定する必要があります。実行時に設定しますが、解析時間以降は以前に解析されたコンテンツには影響しません。
shopt -s extglob; ls !(*.txt)
これは、(以前に設定されていない場合)1行で実行することはできませんが、2つのextglob
コマンドの間に改行が必要な理由でもあります。
ただし、他のシェルオプションの場合はそうではありません。たとえば、次の状況を考えてみます。
$ ls -a
. .. .hiddenFile file1 file2 file3
$ shopt dotglob
dotglob off
$ echo *
file1 file2 file3
$ shopt -s dotglob; echo *
.hiddenFile file1 file2 file3
パーサーがどのシェルオプションを使用してextglob
それを使用するグループコマンドでアクティブにできないか、どこかに文書化されていますか?
内部にshopt
bash
マニュアルページ上記の行為については言及がないようです。
答え1
extglobのようなパーサーは、どのシェルオプションを使用してそれを使用するグループコマンドでアクティブにできないかどこかに文書化されていますか?
否定的なものを証明するのは難しいですが、包括的なリストがあるかどうか疑われます。
構文解析に影響を与えるものとして私が見つけたものは次のとおりであり、他にもあります。
extglob
- 角かっこの意味を変更します。それ以外の場合は特殊文字です。expand_aliases
- エイリアスは処理の初期に拡張されます。extquote
- 一部の引用の意味を変更しました。interactive_comments
#
--単語の開始の意味を変更します。
いくつかのcompat*
オプションは同様の効果を持つかもしれませんが、テストはより興味のある人に任せます。
一方、dotglob
などのfailglob
ものはglobstar
globの結果にのみ影響し、構文解析方法には影響しません。
関連して、extglob
このようなコマンドラインはsetの有無にかかわらず有効です!(foo)
。extglob
これを使用するとすべてのファイルと一致する glob ですがfoo
、これがなければコマンドを実行しfoo
て逆の値を返すサブシェルです。
実際には問題になりません。スクリプトはshopt
コマンドを独自の行に配置できるため、構文解析の変更は問題なく次の行に影響します。 1行のコードで-O
コマンドラインのオプションを使用できます。たとえば、bash -O extglob -c 'echo !(foo)'
拡張globが機能します。