我有一个程序可以从 stdin 获取输入并在 stdout 中产生输出,如下所示:
cat initial_input.txt | myprogram myindex myoptions - | filter_output > outfile.txt
程序在开始处理输入之前会加载一个数据结构 (myindex),这可能需要相当长的时间。部分输出可以反馈给程序。我想将部分 stdout 回送到程序所采用的 stdin,以便将其附加到程序调用的初始输入的末尾,而不会中断初始程序执行,因为最初将 myindex 加载到其中需要时间。
有没有办法做到这一点?
答案1
您可能能够使用 tail 来实现这一点:
tail -f initial_input.txt -n 100000 | myprogram myindex myoptions - | filter_output >> initial_input.txt
此处重点:
- tail;它的工作原理与 cat 相同,但(使用 -f 选项)它会“跟随”文件末尾,因此随着文件的增长,它会将更多数据转储到 stdout。-n 选项指定最初要转储多少行(默认情况下我认为它只转储 10 行),因此您需要将该数字至少与文件中的原始行数一样大。
; 注意,最后我使用 >> 而不是 >,就像您的问题中那样。这告诉 shell 追加内容,而不是覆盖现有文件。
请注意,如果您不在严格控制的环境中,这可能是一件“危险”的事情。我所说的“严格控制”是指您知道没有其他人会读取或写入您的 initial_input.txt 文件。如果多个进程同时尝试写入该文件,您将得到垃圾。但听起来您可能正在处理只有您自己修改的文件,并且您自己将它们放在那里,所以您应该是安全的。