web-dev-qa-db-ja.com

zsh:拡張グロブを常に有効にすることに問題はありますか?

偶然出会った

_setopt extended_glob
_

...特定のパターンを除外するなど、いくつかのクールなワイルドカードの追加を可能にする拡張グロブを有効にするために、たとえば次のようになります。

_ls ^foo*
_

... _foo*_に一致するパターンを除いて、現在のディレクトリ内のすべてのパスでlsを使用します。

_setopt extended_glob_を_.zshrc_内に配置することを提案するチュートリアルを見つけましたが、多くのzsh構成テンプレートがそのオプションを見逃しており、オプションがデフォルトで無効になっているいくつかの欠点があるか、副作用さえ?

それとも、_extended_glob_の中に入れて_.zshrc_を常に有効にすることは、まったく無害ですか?

2
daniel451

潜在的な問題は、_^_がファイル名で非常に有効な文字であるため、オプションが設定されているかどうかに応じて、それを含むパターンの意味が変わると思います。

_$ touch 'foo' 'bar' '^foo' '^bar'
$ ls ^foo*
^foo
$ setopt extendedglob
$ ls ^foo*           
bar  ^bar  ^foo
_

標準のシェルは_^_を通常の文字として使用するため、互換性のためにこの機能はデフォルトで無効になっている可能性があります。

有効になっているオプションを覚えている限り、つまりシェルがグロブをどのように解釈するかを知っている限り、_extended_glob_を有効のままにしておくことはインタラクティブな使用では問題になりません。

それを予期しないが奇妙なファイル名を使用するスクリプトの場合、それは問題になりますが、非対話型シェルは_.zshrc_を読み取るべきではないので、そこに設定しても問題ありません。 _.zshenv_には設定しないでください。


Kshスタイルの拡張グロブ(@(...|...)など、_setopt kshglob_)にも同様の問題があり、zshがグロブの括弧を処理する方法と競合します。 @(f|b)は、kshglobが設定されているかどうかによって異なる意味を持ちます。

6
ilkkachu