に焦点を絞るとbash
、この答えStack Overflow では以下のように報告されています。
extglob
使用されるフラグパーサーによって関数、複合コマンドなどは、実行前に全体的に解析されます。したがって、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
マニュアルのページ上記の動作については何も言及されていないようです。
答え1
extglob のようなパーサーによって使用されるシェル オプションは、それらを使用するグループ コマンド内で有効にできないことがどこかに文書化されていますか?
否定を証明するのは難しいですが、包括的なリストがあるかどうかは疑問です。
解析に影響するものとして私が見つけたものは以下のとおりですが、他にもある可能性があります。
extglob
-- 括弧の意味を変更します。括弧は特殊文字です。expand_aliases
-- エイリアスは処理のかなり早い段階で展開されますextquote
-- 引用文の意味が変わりますinteractive_comments
#
--単語の先頭の意味が変わります。
いくつかのcompat*
オプションにも同様の効果があるかもしれませんが、テストはもっと興味のある人に任せます。
一方、、およびのようなものは、dotglob
globの結果にのみ影響し、解析方法には影響しません。failglob
globstar
に関してextglob
、 のようなコマンドラインは、 set!(foo)
の有無にかかわらず有効ですextglob
。set がある場合、これは を除くすべてのファイルに一致するグロブでありfoo
、set がない場合、これはコマンド を実行するサブシェルでありfoo
、戻り値は反転されます。
実際には、これは問題にならないことに注意してください。スクリプトでは、shopt
コマンドを独自の行に置くことができるため、解析の変更は問題なく次の行に影響します。ワンライナーでは、-O
コマンドラインでオプションを使用できます。たとえば、 ではbash -O extglob -c 'echo !(foo)'
、拡張グロブが機能します。