Shell 同时将输出直接转换为标准输出和输出文件

Shell 同时将输出直接转换为标准输出和输出文件,shell,unix,file-io,Shell,Unix,File Io,我知道 ./executable &>outputfile 将标准输出和标准错误重定向到文件。这是我想要的,但我也希望输出继续在终端中打印。最好的方法是什么 好的,这是我的确切命令:我已经试过了 ./damp2Plan 10 | tee log.txt 及 其中10只是传递给main的一个参数。两者都不能正常工作。结果是,代码中的第一条printf语句确实进入了terminal和log.txt,但其余语句都没有进入terminal和log.txt。我在(精确穿山甲)。使用tee

我知道

./executable &>outputfile
将标准输出和标准错误重定向到文件。这是我想要的,但我也希望输出继续在终端中打印。最好的方法是什么

好的,这是我的确切命令:我已经试过了

./damp2Plan 10 | tee log.txt

其中10只是传递给main的一个参数。两者都不能正常工作。结果是,代码中的第一条printf语句确实进入了terminal和log.txt,但其余语句都没有进入terminal和log.txt。我在(精确穿山甲)。

使用
tee

/executable 2>&1 | tee输出文件


tee
分块输出,在看到任何输出之前可能会有一些延迟。如果您希望更接近实时输出,可以像现在这样重定向到文件,并在不同的shell中使用
tail-f
对其进行监视:

/executable 2>&1>输出文件


tail-f outputfile

否,
cmd&>file
不会重定向到文件。在某些shell中,它会这样做,但在其他shell中,它会在后台运行
cmd
,而不重定向并截断文件。未指定
&>
的行为。输出一行后,
/damp2Plan
是否仍在运行,还是已完成?如果它仍在运行,则可能是
tee
缓冲了以后的输出。在这种情况下,您要么需要编写更多输出,要么等待
/damp2Plan
完成。@craig65535是的,我相信。/damp2Plan仍在运行,因为它正在继续将输出打印到其他文件中。“写更多的输出”是什么意思?我不想等它完成,因为它大约需要10分钟。在这一点上,我在想,只需输入一个fprintf来匹配每个printf可能会更容易。@whatsherface我是说tee以块的形式输出。如果您的程序没有生成太多输出,tee可能会在写入stdout和文件之前等待其缓冲区已满。您的程序也有自己的输出缓冲区-除非随后刷新stdout,否则不会立即输出printf。如果您希望更接近实时输出,您可以重定向到一个文件,并在另一个shell中使用
tail-f
监视它。我修改了我的答案,以表明这一点。@craige65535我想日志文件的实时更新并不是很重要。我真的只希望终端输出继续实时(它通过循环每隔几千次打印一次输出)。当程序完成后,我能从终端抓取所有东西并将其粘贴到文件中吗?不知道如何实现自动化。您可以在
屏幕
会话中运行程序,程序完成后,使用
Ctrl-a:hardcopy-h outputfile
将滚动缓冲区转储到文件中。这还不是你所需要的。是的,所以我猜当我使用tee时,所有的东西都在缓冲区里?终端(除了第一条获取用户输入的语句)或输出文件中没有显示任何内容。如果文件中有任何内容需要查看,那么使用tail-f将完全有效。我安装了screen,但我正在处理它。我相信我最终会找到办法的。谢谢你的帮助!
./damp2Plan 10 2>&1 | tee log.txt