在列出命令中需要透過管道輸入“ls”的特定文件

在列出命令中需要透過管道輸入“ls”的特定文件

我正在尋找一種優雅的交叉兼容方式來將文件名定向到entr.我知道以下命令適用於 Bash,但我想要一個可以在其他 shell 中使用的命令。

(entr是一個監視文件並在啟動時以及這些文件更改時運行命令的程序。ls *.ext例如,它的文檔顯示,通過管道傳輸到它- 因此它期望通過管道傳輸到它的換行符分隔的合法文件名列表。它會警告錯誤的檔案名稱.)

多線

此命令允許我列出帶有多行字串的特定檔案:

$ entr echo "command ran" <<< "
> filename1
> filename2
> "

我發現引號和必須將它們列在單獨的行上很煩人。另外,快速搜尋表明它可能無法在 Bash 以外的 shell 中工作。

我可以使用互動式cat

$ cat | entr echo "command ran"
filename2
filename2

但我每次都必須換行,沒有太多錯誤餘地,並Ctrl-D在最後小心輸入。

Heredoc 的工作原理類似,但涉及書擋語法。

$ cat << EOF | entr echo "command ran"
> filename1
> filename2
> EOF

單行:

我也可以這樣做ls,乍看之下看起來不錯:

$ ls filename1 filename2 | entr echo "command ran" 

ls會剔除拼字錯誤的名稱,同時entr對不正確的名稱進行驗證和警告,並且我擔心以這種方式呼叫 ls 的副作用。

我可以echo在管道到tr之前通過管道到entr

$ echo filename1 filename2 | tr " " "\n" | entr echo "command ran"

但我不喜歡擁有所有額外的命令。

問題:

如何寫一個簡短、優雅且適用於大多數(最好是所有)shell 的指令? posix 期望的語法是理想的。

答案1

由於entr似乎希望每個文件都在單獨的行上,因此您的限制非常有限。你將每個檔案名稱放在單獨的行上。tr如果分隔符號是檔案名稱的一部分(「這是一個檔案名稱」),則任何使其成為單行的嘗試(例如您的範例)都會失敗。

我只想做簡單的事

echo 'filename 1
filename2' | entr echo "command ran"

相關內容