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將由 shell 擴展(我認為是 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.loginaapp.login b。如果在啟動時app.loginb不存在,則不會遵循。如果建立了新的目錄或文件,它也不會跟隨它們。

在沒有匹配的情況下,未擴展的字串將作為參數傳遞給tail

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

因此,它將嘗試遵循文字 pathname/filename /tmp/test/*/app2.log,這可能永遠不會存在(或者如果它確實存在,它是以一種非常奇怪的方式創建的,因為*在正常情況下我不建議使用目錄名稱) 。

相關內容