首页
学习
活动
专区
圈层
工具
发布

修改“._
EN

Stack Overflow用户
提问于 2017-03-21 21:05:11
回答 2查看 3.5K关注 0票数 5

我需要在文件上输出命令的输出。假设我的命令是zip -r zip.zip directory,我需要将/写(任何这些选项都可以)添加到文件中(比如out.txt)。到目前为止,我得到了zip zip.zip directory | tee -a out.txt,但它似乎不起作用,它只是在命令结束时写入整个输出。我怎样才能做到这一点?

(谢谢;)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-21 21:24:17

背景(即为什么?)

重定向是即时的--当您运行somecommand | tee -a out.txt时,使用它的stdout直接发送给tee命令来设置somecommand,该命令由其文档定义为非缓冲,从而将输入中的任何可用内容尽快写入指定的输出接收器。类似地,somecommand >out.txtsomecommand设置为在甚至还未启动之前就将其写入out.txt

什么是,而不是直接是刷新缓冲输出。

也就是说:标准C库和大多数其他工具/语言,在stdout上缓冲输出,将小的写入合并到大的。这通常是可取的,因为减少对内核空间的调用次数(“上下文切换”),而有利于执行更少的更高效、更大的写操作。

所以你的程序并没有真正等待直到它退出来写它的输出--但是它在等待它的缓冲区(可能是32 it,或者64 it,或者其他什么的)是满的。如果它根本没有生成那么多输出,那么它只在关闭输出流时才会被刷新。

解决办法(怎么做?- GNU版本)

如果您是在GNU上,并且您的程序以它找到的方式保留其文件描述符,而不是试图显式地配置缓冲,您可以使用stdbuf命令来配置缓冲,如下所示:

代码语言:javascript
复制
stdbuf -oL somecommand | tee -a out.txt

将stdout (-o)定义为运行somecommand时的行缓冲(L)。

解决办法(怎么做?--预期版本)

或者,如果安装了expect,则可以使用它包含的unbuffer助手:

代码语言:javascript
复制
unbuffer somecommand | tee -a out.txt

...which实际上将模拟TTY (就像expect一样),获得与somecommand直接连接到控制台时相同的非缓冲行为。

票数 14
EN

Stack Overflow用户

发布于 2017-03-21 21:09:14

您是否尝试过选择command > out.log 2>&1此日志来归档所有内容而不显示任何内容,所有内容都会直接进入文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42938106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档