パーサーはどのようなbashシェルオプションを使用しますか?

パーサーはどのようなbashシェルオプションを使用しますか?

私たちの関心を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それを使用するグループコマンドでアクティブにできないか、どこかに文書化されていますか?

内部にshoptbashマニュアルページ上記の行為については言及がないようです。

答え1

extglobのようなパーサーは、どのシェルオプションを使用してそれを使用するグループコマンドでアクティブにできないかどこかに文書化されていますか?

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

構文解析に影響を与えるものとして私が見つけたものは次のとおりであり、他にもあります。

  • extglob- 角かっこの意味を変更します。それ以外の場合は特殊文字です。
  • expand_aliases- エイリアスは処理の初期に拡張されます。
  • extquote- 一部の引用の意味を変更しました。
  • interactive_comments#--単語の開始の意味を変更します。

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

一方、dotglobなどのfailglobものはglobstarglobの結果にのみ影響し、構文解析方法には影響しません。

関連して、extglobこのようなコマンドラインはsetの有無にかかわらず有効です!(foo)extglobこれを使用するとすべてのファイルと一致する glob ですがfoo、これがなければコマンドを実行しfooて逆の値を返すサブシェルです。


実際には問題になりません。スクリプトはshoptコマンドを独自の行に配置できるため、構文解析の変更は問題なく次の行に影響します。 1行のコードで-Oコマンドラインのオプションを使用できます。たとえば、bash -O extglob -c 'echo !(foo)'拡張globが機能します。

関連情報