フォーカスをbash
に限定すると、 この回答 スタックオーバーフローでは、次のように報告されます。
extglob
は使用されるフラグですパーサーによって。関数、複合コマンド、&c。実行前に完全に解析されます。したがって、そのコンテンツを解析する前にextglob
を設定する必要があります。実行時に設定しますが、解析時間後に設定しても、以前に解析されたコンテンツには影響しません。これは、
shopt -s extglob; ls !(*.txt)
をワンライナーとして実行できない理由でもあります(extglob
が以前に設定されていない場合)が、2つのコマンドの間に改行が必要です。
ただし、これは他のシェルオプションには当てはまりません。たとえば、以下。
$ 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
ページ 上記の動作については何も言及されていないようです。
Extglobのようなパーサーによって使用され、したがってそれらを使用するグループコマンド内で有効にできないシェルオプションがどこかに文書化されていますか?
否定的なことを証明するのは難しいですが、包括的なリストがあるとは思えません。
構文解析に影響を与えることがわかったものは以下のとおりです。他にもある可能性があります。
extglob
-括弧の意味を変更します。括弧は特殊文字です。expand_aliases
_-エイリアスは処理のかなり早い段階で拡張されますextquote
-一部の引用符の意味を変更しますinteractive_comments
_- Wordの先頭で_#
_の意味を変更します。一部の_compat*
_オプションも同様の効果がある可能性がありますが、テストはもっと興味のある人に任せます。
一方、dotglob
、failglob
、globstar
のようなものは、グロブの結果にのみ影響し、解析方法には影響しません。
extglob
に関しては、!(foo)
のようなコマンドラインはextglob
が設定されている場合と設定されていない場合のどちらでも有効です。これを使用すると、foo
を除くすべてのファイルに一致するグロブになり、使用しない場合は、コマンドfoo
を実行するサブシェルになり、戻り値が反転します。
実際には、これは問題にはならないことに注意してください。スクリプトでは、shopt
コマンドを独自の行に配置できるため、解析の変更は問題なく次の行に影響します。ワンライナーでは、コマンドラインで_-O
_オプションを使用できます。 bash -O extglob -c 'echo !(foo)'
では、拡張グロブが機能します。