我有一个循环,我正在对一个大文件进行增量修改。我不是每次都写入磁盘,而是使用命名管道。但是,这意味着循环的每次迭代都需要一个唯一的名称,因为我似乎无法将输出重定向回同一个命名管道。
$ mkfifo fifotemp
$ echo qwerty > fifotemp &
$ grep qwe <fifotemp >fifotemp &
$ cat <fifotemp
[hangs]
我可以为每次迭代创建一个新的命名管道,但这似乎不优雅。有没有更好的办法?
我有一个循环,我正在对一个大文件进行增量修改。我不是每次都写入磁盘,而是使用命名管道。但是,这意味着循环的每次迭代都需要一个唯一的名称,因为我似乎无法将输出重定向回同一个命名管道。
$ mkfifo fifotemp
$ echo qwerty > fifotemp &
$ grep qwe <fifotemp >fifotemp &
$ cat <fifotemp
[hangs]
我可以为每次迭代创建一个新的命名管道,但这似乎不优雅。有没有更好的办法?
您可能可以使用普通管道和递归函数。您需要将所有内容传递给递归函数,以确定何时退出以及在每个递归级别需要进行哪些处理。这个例子只是在每一层的每一行的前面添加递归层,并在第 4 层退出:
#!/bin/bash
doEdits() {
while read -r line
do
echo "$1 $line"
done
}
doRecursion() {
level=$(($1 + 1))
#echo "doRecursion $level" 1>&2
if [ $level -lt 4 ]
then
doEdits $level | doRecursion $level
else
# Just output all the input
cat
fi
}
doRecursion 0 < myInputFile > myOutputFile
我假设递归级别的数量相当有限,否则您可能会遇到系统对打开进程和管道数量的限制。
这里的一个优点是每个管道应该只需要一个小的缓冲区。如果您的机器有多个处理器,这也可能很快。