【问题标题】:Why doesn't the output get redirected into the file?为什么输出没有被重定向到文件中?
【发布时间】:2012-12-11 07:29:51
【问题描述】:

我有以下命令行,它通过 perl 脚本每秒输出 vmstat 并在每行上加上时间戳:

vmstat 15 | /home/Beer/addtimestamp.pl > File_1 

addtimestamp.pl 的内容:

!/usr/bin/perl
while (<>) { print localtime() . ": $_"; }

那么为什么不将输出重定向到“File_1”文件?

当我不这样做时它可以完美运行,它每秒完美地打印输出,完全没有问题。

【问题讨论】:

    标签: perl bash redirect output


    【解决方案1】:

    当输出到终端时,perl 的输出是行缓冲的,所以你会看到输出的每一行。当它的输出是一个文件时,它将被块缓冲,所以在一个完整的块准备好写入之前你不会看到任何输出(我认为是 4k,但变量和系统定义的)。

    您需要设置标准输出以使用行缓冲:

    $|=1;
    

    搜索 [perl line buffered output] 你会看到很多关于这个的结果。

    【讨论】:

    • 我通过上面的脚本启动了它,非常感谢!,我只希望它在输出到文件时默认为 Line 缓冲。再次感谢!!
    • 学究式,最好写成:local $|=1;
    • @cdarke 添加 'local' 是什么意思?
    • local 确保效果是本地化的,并且应该在更改任何 Perl 系统全局变量时使用。您在这里绝对不需要它,但是如果您将代码剪切并粘贴到子例程中,它可以确保效果是该代码块的本地效果。
    • @i-am-l 相信我,你真的不希望它默认是行缓冲的。这样做会导致性能极差的情况比不方便的情况更常见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多