Perl中的行缓冲读取

Perl中的行缓冲读取,perl,unix,Perl,Unix,我有一个perl脚本,比如“process_output.pl”,在以下上下文中使用: 长时间运行_命令|“process_output.pl” process_output脚本需要类似于unix“tee”命令,它在生成“long_running_command”时将输出转储到终端,此外还将输出捕获到文本文件,并在“long_running_command”结束时,将文本文件作为输入分叉另一个进程 我目前看到的行为是,“long_running_command”的输出只有在完成时才会转储到终端,

我有一个perl脚本,比如“process_output.pl”,在以下上下文中使用:

长时间运行_命令|“process_output.pl”

process_output脚本需要类似于unix“tee”命令,它在生成“long_running_command”时将输出转储到终端,此外还将输出捕获到文本文件,并在“long_running_command”结束时,将文本文件作为输入分叉另一个进程

我目前看到的行为是,“long_running_command”的输出只有在完成时才会转储到终端,而不是在生成时转储输出。我需要做些特别的事情来解决这个问题吗

根据我在其他几篇stackexchange文章中的阅读,我在“process_output.pl”中尝试了以下内容,但没有得到多少帮助:

  • select(标准输出);$|=1;
  • select(STDIN);$|=1; # 即使需要也不确定
  • 使用文件句柄;标准输出->自动刷新(1)
  • stdbuf-oL-eL long_running_命令|“process_output.pl”
  • 关于如何进一步进行的任何指示

    谢谢
    AB

    这很可能是第一个进程的输出被缓冲的问题,而不是脚本的输入。最简单的解决方案是尝试使用
    unbuffer
    命令(我相信它是
    expect
    包的一部分),类似于

    unbuffer long_running_command | "process_output.pl"
    

    unbuffer
    命令将禁用通常在将输出定向到非交互位置时发生的缓冲。

    这将是
    long\u running\u processing
    的输出处理。它很可能使用的是
    stdio
    ——这将在输出之前查看输出文件描述符连接到了什么。如果它是一个终端(tty),那么它通常会基于行输出,但在上述情况下,它会注意到它正在写入管道,因此会将输出缓冲到更大的块中

    如您所示,您可以通过使用来控制自己进程中的缓冲

    select(STDOUT); $| =1;
    
    这意味着您的进程打印到STDIO的内容没有被缓冲——对输入这样做毫无意义,因为您可以控制缓冲的程度——如果您使用
    sysread()
    ,那么您的读取是无缓冲的,如果您使用
    这样的结构,那么perl将等待,直到它有一个“整行”为止(它实际上读取到下一个输入行分隔符(如变量
    $/
    中定义的,默认情况下为换行符)),然后将数据返回给您

    unbuffer
    可用于“禁用”输出缓冲,其实际作用是使输出进程认为它正在与
    tty
    对话(通过使用伪tty),因此输出进程不缓冲