You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何grep仅在退出程序后才写入文件?命令语法是否有误?

问题分析与解决

这不是语法错误,核心原因是输出缓冲机制——npm或你运行的MagicMirror程序在输出到管道时,切换成了全缓冲模式,而非终端环境下的行缓冲。

为什么会出现延迟写入?

当程序直接输出到终端时,为了让用户实时看到内容,默认用行缓冲:每输出一行就立即刷新到屏幕。但当输出被重定向到管道(比如你的命令里npm start的输出进了tee的管道),很多程序会自动切换成全缓冲:攒够固定大小的缓冲区(通常几KB)才会一次性写入数据。这就导致你看到终端实时输出(因为tee会把内容转接到终端,终端是行缓冲),但grep处理后的内容一直存在缓冲区里,直到程序退出才被强制写入文件。

解决办法

有几种简单的方式可以强制实时写入:

  1. 给npm start强制行缓冲
    用stdbuf工具修改npm start的输出缓冲模式,强制它用行缓冲:

    cd ~/MagicMirror && DISPLAY=:0 stdbuf -oL npm start | tee >( grep 'BACKGROUNDSLIDESHOW: reading path' >> bgss-log.txt )
    

    -oL参数专门针对标准输出设置行缓冲,这样每一行输出都会立刻进入管道,grep就能实时处理并写入文件。

  2. 让grep用行缓冲模式
    直接给grep加--line-buffered参数,让它每匹配到一行就立即写入文件,不管上游的缓冲模式:

    cd ~/MagicMirror && DISPLAY=:0 npm start | tee >( grep --line-buffered 'BACKGROUNDSLIDESHOW: reading path' >> bgss-log.txt )
    

    这个方案不需要修改npm的启动方式,操作更直接。

  3. 用unbuffer模拟终端环境
    如果上面两种方法没效果,可以试试unbuffer,它会伪装成终端让程序保持行缓冲(需要先安装expect包,比如Debian/Ubuntu下执行sudo apt install expect):

    cd ~/MagicMirror && DISPLAY=:0 unbuffer npm start | tee >( grep 'BACKGROUNDSLIDESHOW: reading path' >> bgss-log.txt )
    

验证

修改命令后,触发程序输出目标日志行,直接查看bgss-log.txt就能看到内容实时写入,不需要等程序退出。

内容的提问来源于stack exchange,提问作者CWeinhofer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:33:14