~ 空のパターンを使用したグローバル演算子の動作

~ 空のパターンを使用したグローバル演算子の動作

文書によると、~ 次のように使用できます。グローバルオペレータEXTENDED_GLOB設定すると、次のコンストラクタを受け入れます。

print -rl glob*~globA*~glob*B

したがって、一致するが合計glob*と一致しないすべて。いいね:globA*glob*B

touch file{1,2,3,4{,5}}
setopt extendedglob

print -rl file*~f*3~file4* 

動作は予想通りです。

file1
file2

しかし、空のパターンを使用すると

print -rl file*~f*3~~file4*

印刷

file1
file2
file3

最初のグロブの結果をフィルタリングするために最後のパターンだけが使用されるようです(空の2番目と3番目は無視されます)。

print -rl file*~f*3~file4*~~

生産する

file1
file2
file4
file45

2番目のものだけが使用されています...
奇妙なことは、最初のチルダの後ろのパターンが空の場合はまったく機能しないということです。

print -rl file*~~f*3~file4*

エラー

zsh: no matches found: file*~~f*3~file4*

私がここで何を見逃しているのでしょうか?


zsh 5.3.1重要な場合...

ベストアンサー1

~~空のパターンを使用しないでください。代わりに、次の2つのいずれかを実行します。

  • パターン全体の終わりに文字通り「」と一致します~~
  • 途中で単一の文字を一致させ、次に~除外されたパターンに移動します(つまり、リテラル~の後に~演算子が続きます)。

いくつかの追加項目でファイルセットを拡張すると、次のことが発生することがわかります。

touch file3~ file3~~ file4~ file4~~

次に、最初の奇妙なコマンドを実行します。

print -rl file*~f*3~~file4*
file1
file2
file3
file3~~

file3~3つすべてfile4*と同様に除外されました。file3~~一致しないため、まだ存在しますf*3~

第二:

print -rl file*~f*3~file4*~~
file1
file2
file3~
file3~~
file4
file45
file4~

唯一の一致であるため、Onlyがfile4~~除外されましたfile4*~~

最後のケースでは、次の出力があります。

print -rl file*~~f*3~file4*
file3~
file3~~

これは一致するが一致しない2つのファイルであるためですfile*~f*3file4*

少なくともリテラル以降の演算子の場合は構文解析のバグかもしれませんが、null除外パターンの使用を見ることができないので、他の操作を実行する必要があるかどうかはわかりません。

おすすめ記事