一致しないグローバルパターンから空の文字列を自動的に取得する方法

一致しないグローバルパターンから空の文字列を自動的に取得する方法

3つのファイルがあるフォルダがあるとしましょう。

foo1
foo2
bar

1. 走れば

list_of_files=$(print foo*)
echo $list_of_files

私は得る:foo1 foo2

2.走れば

list_of_files=$(print bar*)
echo $list_of_files

私は得る:bar

三。しかし、私が走ると

list_of_files=$(print other*)
echo $list_of_files

私は次のようになります:(zsh: no matches found: other*変数が$list_of_files空であるにもかかわらず)


glob拡張子と一致できないときにzshが文句を言わないようにする方法はありますか?

私の目標は上記のメカニズムを使用することです何も言わずに指定されたglobパターンに一致するファイルのリストを収集します。

答え1

null_globパターンにglob修飾子を使用するオプションを有効にしますN

list_of_files=(*(N))

スクリプトまたは関数のすべてのパターンに対してこれを行うには、次のnull_globオプションを設定します。

setopt null_glob

この回答bashとkshと同等のものがあります。

代替コマンドを使用またはコマンドしないでくださいprint。これにより、文字列リストではなくファイル名の間にスペースがある文字列が生成されます。 (望むより噴射とは何ですか?シェルプログラミングでは、なぜこれが重要なのでしょうか?)

答え2

より良いアプローチ:for a in *(.N); do ... ; done.Nオプションを使用すると、zshはforに空のリストを渡し、forは0回繰り返されます。

ls *.foo(.N)lsが空の引数のリストを受け取ると、ファイルを一覧表示せずにすべてのファイルを一覧表示します。これが私がNULL_GLOB(またはそれに対応するbash)が好きではない理由です。みんなワイルドカードは、たとえばlsへの呼び出しを簡単に中断できます。

答え3

私はあなたが次のオプションを探していると思いますNULL_GLOB

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

答え4

次の方法を試してください。

list_of_files=$(print other*) 2>/dev/null

エラー出力をstderrから/ dev / nullにリダイレクトして表示しません。

関連情報