パーサーではどの bash シェル オプションが使用されますか?

パーサーではどの bash シェル オプションが使用されますか?

に焦点を絞ると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、そのためそれらを使用するグループ コマンド内で有効にできないことはどこかに文書化されていますか?

の中にshoptbashマニュアルのページ上記の動作については何も言及されていないようです。

答え1

extglob のようなパーサーによって使用されるシェル オプションは、それらを使用するグループ コマンド内で有効にできないことがどこかに文書化されていますか?

否定を証明するのは難しいですが、包括的なリストがあるかどうかは疑問です。

解析に影響するものとして私が見つけたものは以下のとおりですが、他にもある可能性があります。

  • extglob-- 括弧の意味を変更します。括弧は特殊文字です。
  • expand_aliases-- エイリアスは処理のかなり早い段階で展開されます
  • extquote-- 引用文の意味が変わります
  • interactive_comments#--単語の先頭の意味が変わります。

いくつかのcompat*オプションにも同様の効果があるかもしれませんが、テストはもっと興味のある人に任せます。

一方、、およびのようなものは、dotglobglobの結果にのみ影響し、解析方法には影響しません。failglobglobstar

に関してextglob、 のようなコマンドラインは、 set!(foo)の有無にかかわらず有効ですextglob。set がある場合、これは を除くすべてのファイルに一致するグロブでありfoo、set がない場合、これはコマンド を実行するサブシェルでありfoo、戻り値は反転されます。


実際には、これは問題にならないことに注意してください。スクリプトでは、shoptコマンドを独自の行に置くことができるため、解析の変更は問題なく次の行に影響します。ワンライナーでは、-Oコマンドラインでオプションを使用できます。たとえば、 ではbash -O extglob -c 'echo !(foo)'、拡張グロブが機能します。

関連情報