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

Android中如何将getevent命令输出重定向至文件?

解决Android getevent输出重定向后文件为空的问题

这个问题的核心在于标准输出的缓冲机制和进程终止方式的差异,我来给你拆解清楚并提供几个可行的解决方案:

为什么直接用getevent > /path/to/file会失效?

当你把命令输出重定向到文件时,系统会默认使用块缓冲——也就是说,输出内容会先存在内存缓冲区里,攒够一定大小(通常是4KB或8KB)才会一次性写入文件。当你按Ctrl+C发送SIGINT信号强制终止getevent进程时,缓冲区里还没来得及写入的内容直接丢失了,所以最终文件是空的。

而用-c参数时,getevent会在接收指定数量的事件后正常退出,进程正常退出前会主动刷新所有缓冲区,把剩余内容写入文件,所以文件能正常保存输出。

可行的解决方案

1. 用stdbuf强制行缓冲输出

stdbuf可以调整命令的缓冲模式,我们让getevent的标准输出使用行缓冲,这样每一行输出都会立刻写入文件,即使中途按Ctrl+C,已经输出的行也不会丢失:

stdbuf -oL getevent > /path/to/file

这里-oL的含义是将标准输出(stdout)设置为行缓冲模式。

2. 借助tee命令实现实时写入

你已经发现用tee能看到输出,这是因为tee默认使用行缓冲(要实时输出到终端),它会把getevent的输出同时写入文件和终端。如果不想在终端看到输出,可以把tee的输出重定向到/dev/null:

# 同时在终端显示并写入文件
getevent | tee /path/to/file

# 只写入文件,不显示终端输出
getevent | tee /path/to/file > /dev/null

这种方式下,每一行输出都会被tee立刻写入文件,即使Ctrl+C终止进程,已经处理的内容也会保留在文件里。

3. 用script命令模拟终端环境

script命令会创建一个模拟的终端会话,让getevent以为自己在终端输出,从而使用行缓冲。它还会完整记录所有输出:

# 普通模式,会记录脚本启动/结束信息
script -c "getevent" /path/to/file

# 静默模式,只记录getevent的输出
script -qc "getevent" /path/to/file

这个方法的好处是无需调整缓冲参数,终端环境下的命令行为都会被完整捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:11:34