列出命令中需要通过管道输入“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"

相关内容