我试图避免创建任何新文件来存储输出,以尽量减少覆盖同名目录中某些内容的风险。我试图用管道评估流中的每一行,而不是输出到文件然后使用while read line do done < file
循环。就像是:
echo -e "1\n2\n3\n4\n5" | #evaluate current line separately#
我可以以某种方式将每一行读入一个数组,然后评估数组中的元素吗?还是有更好的方法来避免意外覆盖文件?
在bash
中,常用的方法是使用 Process Substitution:
while read line ; do
...
done < <( commands producing the input)
你已经到了一半...
echo -e "1\n2\n3\n4\n5" | while read line; do
...
done
请注意,bash 在单独的进程中运行管道的每个部分,并且在那里定义的任何变量都不会在该块之后持续存在。(ksh93 将保留它们,因为循环将在当前 shell 进程中运行。)
mktemp
您可以通过使用或tempfile
创建具有唯一名称的临时文件来避免覆盖文件。但是,我会在 choroba 的回答中使用流程替换。