ワイルドカードを使用すると、tail コマンドの再試行フラグが機能しないのはなぜですか?

ワイルドカードを使用すると、tail コマンドの再試行フラグが機能しないのはなぜですか?

特定の存在しないファイルを含む、一連の不明なディレクトリ名を tail したい。例:

tail -F /tmp/*/app.log

しかし、ワイルドカードでは意図したとおりに動作しません。そのパスでファイルを作成すると、tailコマンドを再起動しない限り、実行が開始されません。一方、以下を実行すると、

tail -F /tmp/example/app.log

ファイルが表示されるとすぐに、コマンドは次のように出力します。tail: '/tmp/example/app.log' has appeared; following new file

-f filename --retry代わりに の組み合わせを試してみましたが-F、結果は同じでした。

どうすればそれを解決できるでしょうか、また同じ目標を達成する他の方法はあるでしょうか?

答え1

/tmp/*/app.logシェル(BASHだと思います)によって展開されます。一致するものが存在する場合、これはそれらの一致に展開され、引数として渡されます。tail

$ find /tmp/test -type f
/tmp/test/a/app.log                                                                                                                                                                                                                                
/tmp/test/b/app.log                  

$ echo /tmp/test/*/app.log                                                                                                                                                                                        
/tmp/test/a/app.log /tmp/test/b/app.log

したがって、上記のケースでは、はおよびtailを具体的に追跡するように設定されます。 が起動された時点でが存在しなかった場合は追跡されません。新しいディレクトリまたはファイルが作成された場合も、追跡されません。app.logaapp.logbapp.logb

一致しない場合は、展開されていない文字列が引数として渡されます。tail

$ echo /tmp/test/*/app2.log                                                                                                                                                                                     
/tmp/test/*/app2.log               

/tmp/test/*/app2.logしたがって、おそらく存在しないリテラルのパス名/ファイル名に従おうとします(存在する場合でも、*通常の状況ではディレクトリ名として使用することはお勧めできないため、非常に奇妙な方法で作成されています)。

関連情報