Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 修改“…”tee-a out.txt“;要实时流式输出,而不是在完成时?_Bash_Output_Stdout_Stderr - Fatal编程技术网

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
);它具有内置的刷新功能。