如何在此处的文档中连接结果?

Sae*_*ati 1 bash find cat here-document here-string

我有这个脚本:

while read $item;
do
    # Some bash logic here
done <<< "$({ cat /path/to/some/file; echo; })"
Run Code Online (Sandbox Code Playgroud)

现在我还想用来find查找一些目录的名称,并将其与循环一起cat传递while

换句话说,我想:

  • cat一份文件
  • find一些目录
  • 连接结果
  • 将它们作为此处文档送入while循环

我被困在这一点上。

我想到了重复while逻辑,这不是一个好方法。我还考虑while使用函数重用循环内的逻辑。

然而,连接此处文档中的内容似乎是正确的方法。

ste*_*ver 5

实际上<<< "$({ cat /path/to/some/file; echo; })"是一个包含带引号的命令替换的此处字符串,而不是此处文档。正如Kamil Maciorowski已经指出的那样,您已经知道如何在命令替换中连接两个命令的结果,并且可以使用and执行相同的操作:cat /path/to/some/fileechocatfind

... <<< "$(cat /path/to/some/file; find . -name '*foo*')"
Run Code Online (Sandbox Code Playgroud)

我省略了内部,{ ... }因为命令已经按 分组$( ... )

然而,恕我直言,使用进程替换来连接输出会更自然。要了解其工作原理,请从简单的输入重定向开始

while IFS= read -r item
do
    # Some bash logic here
done < /path/to/some/file
Run Code Online (Sandbox Code Playgroud)

它通过 stdin 将文件的内容重定向到循环;然后

while IFS= read -r item
do
    # Some bash logic here
done < <(cat /path/to/some/file)
Run Code Online (Sandbox Code Playgroud)

它将输出转换cat /path/to/some/file为伪文件,您可以以相同的方式重定向该伪文件。现在,将另一个标准输出生成命令添加到进程列表中是一件简单的事情:

while IFS= read -r item
do
    # Some bash logic here
done < <(cat /path/to/some/file; find . -name '*foo*')
Run Code Online (Sandbox Code Playgroud)

参见示例

请注意,在所有情况下,语法read item都不是read $item.


归档时间:

查看次数:

110 次

最近记录:

2 年,8 月 前