
我正在尋找一種優雅的交叉兼容方式來將文件名定向到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"