为何grep仅在退出程序后才写入文件?命令语法是否有误?
问题分析与解决
这不是语法错误,核心原因是输出缓冲机制——npm或你运行的MagicMirror程序在输出到管道时,切换成了全缓冲模式,而非终端环境下的行缓冲。
为什么会出现延迟写入?
当程序直接输出到终端时,为了让用户实时看到内容,默认用行缓冲:每输出一行就立即刷新到屏幕。但当输出被重定向到管道(比如你的命令里npm start的输出进了tee的管道),很多程序会自动切换成全缓冲:攒够固定大小的缓冲区(通常几KB)才会一次性写入数据。这就导致你看到终端实时输出(因为tee会把内容转接到终端,终端是行缓冲),但grep处理后的内容一直存在缓冲区里,直到程序退出才被强制写入文件。
解决办法
有几种简单的方式可以强制实时写入:
给
npm start强制行缓冲
用stdbuf工具修改npm start的输出缓冲模式,强制它用行缓冲:cd ~/MagicMirror && DISPLAY=:0 stdbuf -oL npm start | tee >( grep 'BACKGROUNDSLIDESHOW: reading path' >> bgss-log.txt )-oL参数专门针对标准输出设置行缓冲,这样每一行输出都会立刻进入管道,grep就能实时处理并写入文件。让
grep用行缓冲模式
直接给grep加--line-buffered参数,让它每匹配到一行就立即写入文件,不管上游的缓冲模式:cd ~/MagicMirror && DISPLAY=:0 npm start | tee >( grep --line-buffered 'BACKGROUNDSLIDESHOW: reading path' >> bgss-log.txt )这个方案不需要修改
npm的启动方式,操作更直接。用
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
相关产品推荐
相关产品推荐

