zsh:拡張グローバル問題を常に有効にしますか?

zsh:拡張グローバル問題を常に有効にしますか?

最近触れた

setopt extended_glob

...拡張ワイルドカードを有効にするには、次の特定のパターンを除外するなど、素晴らしいワイルドカードをたくさん追加できます。

ls ^foo*

...ls一致するパターンを除いて、現在のディレクトリのすべてのパスに使用されますfoo*

setopt extended_glob私はあなたのものを置くことを提案するチュートリアルを見つけ.zshrcましたが、多くのzsh設定テンプレートがそのオプションを見逃しており、オプションは次のとおりです。デフォルトでは無効いくつかの欠点や副作用がありますか?

extended_globそれとも、常に1つに入れてアクティブにすることはまったく無害ですか.zshrc

答え1

基本的な問題は、これが^ファイル名でかなり有効な文字であるため、これを含むパターンの意味がオプションを設定するかどうかに応じて変更されることです。

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

標準シェルはこれをプレーン文字として扱うので、^互換性のためにこの機能はデフォルトで無効にすることができます。

どのオプションが有効になっているかを覚えている限り、つまりシェルがglobを解釈する方法を知っている限り、対話型の使用でそのextended_globオプションを有効にすることは問題になりません。

これは予期しませんでしたが、奇妙なファイル名を使用するスクリプトでは問題になる可能性がありますが、非対話型シェルはそれを読み取ることができないため、それを設定すると機能.zshrcします。に設定しないでください.zshenv


kshスタイルの拡張glob(@(...|...)などsetopt kshglob)には、zshがglobブラケットを処理する方法と競合するため、同様の問題があります。設定するか@(f|b)どうかによって意味が異なります。kshglob

関連情報