我需要在文件上输出命令的输出。假设我的命令是zip -r zip.zip directory,我需要将/写(任何这些选项都可以)添加到文件中(比如out.txt)。到目前为止,我得到了zip zip.zip directory | tee -a out.txt,但它似乎不起作用,它只是在命令结束时写入整个输出。我怎样才能做到这一点?
(谢谢;)
发布于 2017-03-21 21:24:17
背景(即为什么?)
重定向是即时的--当您运行somecommand | tee -a out.txt时,使用它的stdout直接发送给tee命令来设置somecommand,该命令由其文档定义为非缓冲,从而将输入中的任何可用内容尽快写入指定的输出接收器。类似地,somecommand >out.txt将somecommand设置为在甚至还未启动之前就将其写入out.txt。
什么是,而不是直接是刷新缓冲输出。
也就是说:标准C库和大多数其他工具/语言,在stdout上缓冲输出,将小的写入合并到大的。这通常是可取的,因为减少对内核空间的调用次数(“上下文切换”),而有利于执行更少的更高效、更大的写操作。
所以你的程序并没有真正等待直到它退出来写它的输出--但是它在等待它的缓冲区(可能是32 it,或者64 it,或者其他什么的)是满的。如果它根本没有生成那么多输出,那么它只在关闭输出流时才会被刷新。
解决办法(怎么做?- GNU版本)
如果您是在GNU上,并且您的程序以它找到的方式保留其文件描述符,而不是试图显式地配置缓冲,您可以使用stdbuf命令来配置缓冲,如下所示:
stdbuf -oL somecommand | tee -a out.txt将stdout (-o)定义为运行somecommand时的行缓冲(L)。
解决办法(怎么做?--预期版本)
或者,如果安装了expect,则可以使用它包含的unbuffer助手:
unbuffer somecommand | tee -a out.txt...which实际上将模拟TTY (就像expect一样),获得与somecommand直接连接到控制台时相同的非缓冲行为。
发布于 2017-03-21 21:09:14
您是否尝试过选择command > out.log 2>&1此日志来归档所有内容而不显示任何内容,所有内容都会直接进入文件。
https://stackoverflow.com/questions/42938106
复制相似问题