我有这个脚本:
while read $item;
do
# Some bash logic here
done <<< "$({ cat /path/to/some/file; echo; })"
现在我还想用来find
查找一些目录的名称,并将其与循环一起cat
传递while
。
换句话说,我想:
cat
一份文件find
一些目录- 连接结果
- 将它们作为此处文档送入
while
循环
我被困在这一点上。
我想到了重复while
逻辑,这不是一个好方法。我还考虑while
使用函数重用循环内的逻辑。
然而,连接此处文档中的内容似乎是正确的方法。
答案1
其实<<< "$({ cat /path/to/some/file; echo; })"
是一个这里的字符串包含引用的命令替换而不是这里的文档。作为卡米尔·马乔罗夫斯基有已经指出了,您已经知道如何在命令替换中连接两个命令的结果cat /path/to/some/file
,echo
并且可以使用cat
and执行相同的操作find
:
... <<< "$(cat /path/to/some/file; find . -name '*foo*')"
我省略了内部,{ ... }
因为命令已经按 分组$( ... )
。
然而,恕我直言,使用它会更自然流程替代连接输出。要了解其工作原理,请从简单的输入重定向开始
while IFS= read -r item
do
# Some bash logic here
done < /path/to/some/file
它通过 stdin 将文件的内容重定向到循环;然后
while IFS= read -r item
do
# Some bash logic here
done < <(cat /path/to/some/file)
它将输出转换cat /path/to/some/file
为伪文件,您可以以相同的方式重定向该伪文件。现在,将另一个标准输出生成命令添加到进程列表中是一件简单的事情:
while IFS= read -r item
do
# Some bash logic here
done < <(cat /path/to/some/file; find . -name '*foo*')
参见示例
请注意,在所有情况下,语法read item
都不是read $item
.