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にリダイレクトして表示しません。