我正在寻找一种优雅的交叉兼容方式来将文件名定向到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"