web-dev-qa-db-ja.com

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

フォーカスを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ページ 上記の動作については何も言及されていないようです。

1
Axel Krypton

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

否定的なことを証明するのは難しいですが、包括的なリストがあるとは思えません。

構文解析に影響を与えることがわかったものは以下のとおりです。他にもある可能性があります。

  • extglob-括弧の意味を変更します。括弧は特殊文字です。
  • _expand_aliases_-エイリアスは処理のかなり早い段階で拡張されます
  • extquote-一部の引用符の意味を変更します
  • _interactive_comments_- Wordの先頭で_#_の意味を変更します。

一部の_compat*_オプションも同様の効果がある可能性がありますが、テストはもっと興味のある人に任せます。

一方、dotglobfailglobglobstarのようなものは、グロブの結果にのみ影響し、解析方法には影響しません。

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


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

1
ilkkachu