glob *.{a,b,}test で中括弧拡張を使用する場合、zsh では「一致しない」を無視します。

glob *.{a,b,}test で中括弧拡張を使用する場合、zsh では「一致しない」を無視します。

foldernameまたはtestというatestフォルダ内のすべてのファイルを一覧表示したいと思いますbtest

私の最初の反応はプレーすることでしたls ./foldername/*.{a,b,}test

拡張機能にコンテンツがない場合は正常に動作しますatest。この場合、エラーが発生しますzsh: no matches found: ./foldername/*.atest

このエラーを無視して存在するファイルを印刷する方法はありますか?

zsh と Bash の両方で動作するために必要です。

ベストアンサー1

存在する

ls -d ./foldername/*.{a,b,}test

{a,b,...}グローバル演算子ではない、これは中括弧拡張であり、まず次に拡張されます。

ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test

各 glob は個別に拡張され、一致しない glob がある場合は、期待どおりにコマンドがキャンセルされますzsh(またはfish同様の動作のオプションを取得する必要bashがあります)。failglob

ここでは、これらすべてのファイルと一致する単一のglobを使用し、そのglobがどのファイルとも一致しない場合にのみコマンドをキャンセルしようとします。

ls -d ./foldername/*.(a|b|)test

nullglob単一のglobマッチがないかのように使用したくなく、ls引数なしで実行されるため、現在のディレクトリが一覧表示されます。cshnullglob一致しないglobを削除しますが、すべてのglobが一致しない場合はまだコマンドをキャンセルするので、これに関連してより良いです。

あなたはそれを使用したくないでしょう。なぜなら、それはあなたに恥ずかしいnonomatch物品の破損行為をもたらすからです。bash

とinの両方で機能するglobの代替案では、zshksh glob(inとin)bashを使用できます。set -o kshglobzshshopt -s extglobbash

次に、次の操作を行います。

ls -d ./foldername/*.@(a|b|)test

または:

ls -d ./foldername/*.?([ab])test

矛盾があるときにglobがそのまま渡されるのを防ぐには、このfailglobオプションを追加してください。bashls

バラよりnullglobがデフォルトではないのはなぜですか?より多くの情報を知りたいです。

おすすめ記事