Bash 修改“…”tee-a out.txt“;要实时流式输出,而不是在完成时?
我需要在文件上输出命令的输出。假设我的命令是Bash 修改“…”tee-a out.txt“;要实时流式输出,而不是在完成时?,bash,output,stdout,stderr,Bash,Output,Stdout,Stderr,我需要在文件上输出命令的输出。假设我的命令是zip-r zip.zip目录,我需要将(这些选项中的任何一个都可以)附加/写入文件(比如out.txt)。到目前为止,我得到了zip.zip目录| tee-a out.txt,但它似乎不起作用,它只是在命令结束时写入整个输出。。。我怎样才能做到这一点 谢谢;) 您是否尝试了选项command>out.log 2>&1此日志将所有内容归档而不显示任何内容,所有内容都将直接进入文件背景(即为什么?) 重定向是即时的——当您运行somecommand |
zip-r zip.zip目录
,我需要将(这些选项中的任何一个都可以)附加/写入文件(比如out.txt
)。到目前为止,我得到了zip.zip目录| tee-a out.txt
,但它似乎不起作用,它只是在命令结束时写入整个输出。。。我怎样才能做到这一点
谢谢;) 您是否尝试了选项
command>out.log 2>&1
此日志将所有内容归档而不显示任何内容,所有内容都将直接进入文件背景(即为什么?)
重定向是即时的——当您运行somecommand | tee-a out.txt
时,somecommand
设置为将其stdout直接发送到tee
命令,该命令由其文档定义为无缓冲,从而将其输入上可用的任何内容尽快写入其指定的输出接收器。类似地,somecommand>out.txt
将somecommand
设置为在启动之前就开始写入out.txt
不是立即的是缓冲输出的刷新
这就是说:标准C库和大多数其他工具/语言在标准输出上进行缓冲输出,将小的写入合并为大的写入。这通常是可取的,因为减少了对内核空间(“上下文开关”)的调用数量,有利于进行少量更高效、更大的写入
因此,您的程序并不是真正在等待退出写入其输出,而是等待其缓冲区(可能是32kb或64kb,或其他)已满。如果它从来没有生成过那么多的输出,那么它只有在关闭输出流时才会被刷新
解决方法(如何?--GNU版本) 如果您在GNU平台上,并且您的程序将其文件描述符保留为查找它们的方式,而不是尝试显式配置缓冲,则可以使用
stdbuf
命令来配置缓冲,如下所示:
stdbuf -oL somecommand | tee -a out.txt
在运行somecommand
时,将stdout(-o
)定义为行缓冲(L
)
解决方法(如何?--预期版本) 或者,如果安装了
expect
,则可以使用unbuffer
帮助程序,它包括:
unbuffer somecommand | tee -a out.txt
…这将实际模拟TTY(正如
expect
所做的那样),获得与直接连接到控制台的somecommand
相同的非缓冲行为。如何“不工作”?到底发生了什么?@charlesduff;编辑)啊!所以你看到的是缓冲。如果你正在写一个足够大的文件,你会看到它的增量块。。。只是那些块比一行大。这是。这个问题可以说是重复的,或,或诸如此类。即使命令还没有结束,它是否会追加/写入到文件中?@Blaxou,当然了——退出的命令不能写入任何内容。(顺便说一句,这就是为什么不必要地使用kill-9
是一种不好的形式的部分原因:当你终止一个程序而没有给它一个清理自己的机会时,它就不能刷新它的缓冲区并将它一直保存的内容写入它的stdout…或其他任何地方)。哼,好的!更清楚!谢谢你的解释!那么,是否可以取消缓冲zip
命令?(我在MacOS上)…嗯,你有没有尝试过unbuffer zip.zip目录
?顺便说一句,我个人在OS X上有unbuffer
,方法是在macports上安装expect
。我想自制软件也会带有expect
。我会尽快的。)谢谢你的回答,很抱歉你问了这样的问题;)Perl有一个模块用于处理zip
归档文件(IO::Compress::zip
);它具有内置的刷新功能。