kshglobをオンにした後でも、zshで!(単一パターン)を使用できないのはなぜですか?


8

これはbashで動作します:

touch a b c
echo !(a)

上記のスクリプトをzshで(kshglobonで)実行すると、文句が表示されます。

zsh: number expected

私が|後に追加した場合a、それは動作します:

echo !(a|)

どうして?

回答:


10

この場合、パターンの最後にあるため、それは裸のglob修飾子と競合します。*(a1)最終日に最後にアクセスされたファイルと見なされます。(a1)グロブ修飾子として扱われます。したがって、あなたの!(a)場合、zshはaglob修飾子(ここではと呼ばれるファイルに適用されます!)の後に欠落している日数について不平を言います。

zshグロブ、(...)グループ化は、主に使用されます(foo|bar)ので、追加して、交代|必ず末尾を作るために文書化の方法です(...)グロブ修飾子として扱われていません。

もう1つの文書化された代替方法は、括弧(!((a)))を2つにすることです。または、空のグロブ修飾子(など!(a)(-))を追加することもできます。

このあいまいさを完全になくすには、bare_glob_qualオプション(set +o bareglobqual)をオフにしてから、グロブ修飾子をextendedglob (#q...)構文(*(#qa1)ここ)で記述する必要があります。

kshglob(オプション1998で追加され、ほぼ同じ時間にはbashその追加extglobbashはその前に、拡張されたグロブを持っていなかったが)のために主に存在しているksh(エミュレーションモードemulate ksh)、のためにzsh実行できるようにするkshスクリプト、kshglob有効になっており、bareglobqual無効になっていますが。それが最初に導入された場合は、有効にした後kshglobのように、あなたはグロブ修飾子を指定する必要があると思い-(...)紛争のようなものを避けるが、あまりにも多くの混乱を引き起こし、と競合することをする@-(...)の構文ksh93(#q...)およびbareglobqualオプションは、後に導入されました。

zshユーザーは一般にset -o extendedglob、入力がより簡単で(ほとんどの場合)より強力なzsh独自の拡張glob()演算子を好んで使用します(ksh88演算子kshglobもで有効になっていますbash -O extglob)。

たとえば、!(foo)と書かれ^fooます。!(foo|)barただし、同等のものはのように長くなり(^(foo|))barます。

その他のksh88-> zsh変換:

  • *(x) -> x#
  • +(x) -> x##
  • @(x|y) -> x|y
  • ?(x) -> (x|)

一部のksh93-> zsh変換:

  • ~(i:x)-> (#i)x(大文字と小文字を区別しない)
  • ~(N)x-> x(N)(nullglob、zshで発生)
  • {1,5}(x) -> x(#c1,5)
  • @(foo&bar)-> foo~^barまたは^(^foo|^bar)

でのみ見つかるものzsh

  • <1-23> (10進数の範囲)
  • pattern~except
  • pattern(glob-qualifier) (zshグロブのキラー機能)
  • (pattern/)#(に一致する任意のレベルのサブディレクトリpattern;の**/簡略バージョン(*/)#も最近ksh93とbashに追加されました)
  • ***/* (シンボリックリンクに続く再帰的グロビング)。
  • (#a1)foobar (近似マッチング、いくつかのエラーを許可、ここでは1)
  • ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.