web-dev-qa-db-ja.com

一致しないグロブパターンから空の文字列を静かに取得する方法

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に文句を言わないようにする方法はありますか?

私の目標は、上記のメカニズムを使用してサイレントに指定されたグロブパターンに一致するファイルのリストを収集することです。

24

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。

16
arnt

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
enzotib