kshglobをオンにしても(シングルモード)zshで利用できないのはなぜですか?

kshglobをオンにしても(シングルモード)zshで利用できないのはなぜですか?

これはbashで動作します。

touch a b c
echo !(a)

kshglobzsh(open ) で上記のスクリプトを実行すると、次のエラーが発生します。

zsh: number expected

|その後、追加するとa動作します。

echo !(a|)

なぜ?

答え1

この場合は、次のようなものです。ネイキッドグローブ修飾子なぜなら、パターンの終わりにあるからです。*(a1)最後の日付に最後にアクセスしたファイルと見なされます。(a1)グローバル修飾子として扱われます。したがって、あなたの!(a)場合、zshはglob修飾子の後に行方不明の日数について文句を言いますa(ここでは名前がファイルに適用されます!)。

zshglobでは、グループ化は主に置換(...)に使用されるため、aを追加することは、末尾がglob修飾子と見なされないようにする文書化された方法です。(foo|bar)|(...)

別の文書化された代替案は、二重括弧(!((a)))または空のglob修飾子(たとえば!(a)(-))を追加することです。

これらのあいまいさを完全に削除するには、bare_glob_qualオプション(set +o bareglobqual)をオフにして構文extendedglob (#q...)*(#qa1)ここ)を使用してglob修飾子を作成する必要があります。

オプションkshglob(1998年に追加されました、同様のタイミングでbash追加されましたextglobが、以前は bash に glob への拡張がなかったにもかかわらず、) はkshエミュレーションモード ( emulate ksh) で主に使用されており、有効化と無効化されたスクリプトを実行できます。最初に導入されたときにこれらの競合を避けるために有効になった場合は、glob修飾子を指定する必要がありましたが、これにより混乱が多すぎ、構文と競合が発生し、その後とオプションが導入されました。zshkshkshglobbareglobqualkshglob-(...)@-(...)ksh93(#q...)bareglobqual

zshset -o extendedglobユーザーは一般的に入力しやすく(ほとんどの人にとって)、より強力な(kshglobksh88演算子も有効になっているよりも)zshの自己拡張glob()演算子を好みます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)(zshに由来するnullglob)
  • {1,5}(x)->x(#c1,5)
  • @(foo&bar)->foo~^barまたは^(^foo|^bar)

一部は以下でのみ見つかりますzsh

  • <1-23>(小数点範囲)
  • pattern~except
  • pattern(glob-qualifier)(zsh globのキラー機能)
  • (pattern/)#(サブディレクトリのすべてのレベルと一致します。pattern最近ksh93とbashにも**/単純化されたバージョンが追加されました)(*/)#
  • ***/*(シンボリックリンクの後の再帰ワイルドカード)
  • (#a1)foobar(おおよそのマッチング、いくつかのエラーは許可されています、ここでは1)
  • ...

関連情報