wis*_*cky 8 bash io-redirection
有没有更短的写法?基本上将命令输出到文件,然后使用该文件作为下一个命令的输入。我还想保留该文件以供以后查看。
cmd1 > verylong.txt; cmd2 < verylong.txt
我知道我能做到
cmd1 | tee verylong.txt | cmd2
但是由于我希望“verylong.txt”是一个巨大的文件,我认为使用管道会降低效率,因为它会将整个文件保存在内存中。而如果我使用文件输入,那么它会一次处理一行。(或者我的假设是错误的?)
如果我能做一些优雅的事情就好了
cmd1 > verylong.txt > cmd2
use*_*791 16
据我所知,cmd1 | tee verylong.txt | cmd2不会将整个文件保存在内存中。事实上,如果cmd2在使用其输入之前等待太长时间,则cmd1可能会阻塞write调用并仅在cmd2再次开始读取时解除阻塞。
原因是管道有一个缓冲区,默认情况下,该缓冲区被限制为某个合理的大小。
当然,如果这个故事可能是不同cmd2的sort(或东西一样),其中整个输入必须在命令前阅读能写它的输出。在这种情况下,整个文件内容可能保存在cmd2内存中,但这与输入该命令时使用的是管道还是中间文件无关。
已经给出的答案是正确的。但是,如果您的目标是有选择地阅读verylongfile.txtw/ cmd2,则sed可能是另一种选择。
cmd1 | sed -e 'w verylongfile.txt' -e '/notinteresting/d' | cmd2
Run Code Online (Sandbox Code Playgroud)
sed将w其所有输入写入输出文件,但只/notinteresting/写入与管道地址不匹配的位。或者,您可能会否定/interesting/!d仅将与interesting地址匹配的行写入管道的操作。
如果这不是您的目标,请改用tee- 它是一种更有效的工具,可将其整个输入写入输出文件和管道。