加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何防止管道延迟输出?

发布时间:2020-12-16 01:52:41 所属栏目:安全 来源:网络整理
导读:当我在bash中运行下面的命令时,它会等到程序完成后再刷新所有输出.如果我移除管道,则立即打印每一行. { for i in `seq 3` ; do echo $i ; sleep 1 ; done ; } | perl -p -e 's,(.*ERROR.*),e[01;31m1e[00m,g' | perl -p -e 's,(.*WARNING.*),e[01;33
当我在bash中运行下面的命令时,它会等到程序完成后再刷新所有输出.如果我移除管道,则立即打印每一行.

{ for i in `seq 3` ; do echo $i ; sleep 1 ; done ; } 
    | perl -p -e 's,(.*ERROR.*),e[01;31m1e[00m,g' 
    | perl -p -e 's,(.*WARNING.*),e[01;33m1e[00m,(.*TCPEchoTest.*),e[01;30m1e[00m,(.*enters.*),e[00;33m1e[00m,g'

如何使用管道并仍然立即打印每条线?

解决方法

你可以用重复的-e选项连接几行perl代码(一定要用它们结束; – 它们串在一起形成一个程序).你可以用$| = 1使你的管道“热”.有关详细信息,请参阅 perl manual on $|(页面下方2/3,搜索OUTPUT_AUTOFLUSH).

{ for i in `seq 3` ; do echo $i ; sleep 1 ; done ; } 
  | perl -p -e 'BEGIN{$|=1};' 
            -e 's,g;' 
            -e 's,g;'

这将打印1,2,3,每个数字之间有一秒钟.实际上,当perl输出到终端时,不需要BEGIN行.但是如果你继续管道到另一个程序,你想要它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读