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
は空です)
グロブ展開に一致しない場合にzshに文句を言わないようにする方法はありますか?
私の目標は、上記のメカニズムを使用してサイレントに指定されたグロブパターンに一致するファイルのリストを収集することです。
N
グロブ修飾子を使用して、パターンのnull_glob
オプションをオンにします。
list_of_files=(*(N))
スクリプトまたは関数のすべてのパターンでこれを行う場合は、null_glob
オプションをオンにします。
setopt null_glob
この回答 にはbashとkshに相当するものがあります。
print
またはコマンド置換を使用しないでください!これは、文字列のリストの代わりに、ファイル名の間にスペースを含むファイル名で構成される文字列を生成します。 (参照 ワード分割とは何ですか?シェルプログラミングでなぜそれが重要なのですか? )
より良い方法:for a in *(.N); do ... ; done
。 Nオプションを指定すると、zshは空のリストをforに配信し、forはゼロ回反復します。
ls *.foo(.N)
に注意してください。 lsが空の引数リストを受け取ると、何もではなくすべてのファイルをリストします。これが、私がNULL_GLOB(またはそのbashの同等物)を好まない理由です。これはallグロブを変更し、簡単に呼び出しを中断します。 ls。
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.