これはbashで動作します。
touch a b c
echo !(a)
kshglob
zsh(open ) で上記のスクリプトを実行すると、次のエラーが発生します。
zsh: number expected
|
その後、追加するとa
動作します。
echo !(a|)
なぜ?
答え1
この場合は、次のようなものです。ネイキッドグローブ修飾子なぜなら、パターンの終わりにあるからです。*(a1)
最後の日付に最後にアクセスしたファイルと見なされます。(a1)
グローバル修飾子として扱われます。したがって、あなたの!(a)
場合、zshはglob修飾子の後に行方不明の日数について文句を言いますa
(ここでは名前がファイルに適用されます!
)。
zsh
globでは、グループ化は主に置換(...)
に使用されるため、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修飾子を指定する必要がありましたが、これにより混乱が多すぎ、構文と競合が発生し、その後とオプションが導入されました。zsh
ksh
kshglob
bareglobqual
kshglob
-(...)
@-(...)
ksh93
(#q...)
bareglobqual
zsh
set -o extendedglob
ユーザーは一般的に入力しやすく(ほとんどの人にとって)、より強力な(kshglob
ksh88演算子も有効になっているよりも)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)- ...