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

Mac中使用Process执行adb shell date > date.txt命令失败问题咨询

解决Java自动化脚本中ADB命令跨Windows/Mac的重定向问题

这个问题我之前踩过同款坑!核心原因是Windows和Unix-like系统(比如Mac)对shell命令的解析逻辑完全不一样,直接导致重定向符号>的作用对象跑偏了。

问题根源

在Windows上,adb shell date > date.txt这条命令里,>是被Windows的cmd接管解析的——它会先让adb执行shell date拿到设备时间,再把输出结果重定向到本地项目目录的date.txt里,这就是为啥Windows下正常。

但到了Mac(Unix系统),整个命令会被当作一个完整参数传给adb,>就变成了Android设备shell里的重定向操作,相当于让设备在自己的文件系统里创建date.txt,而你大概率没有设备对应目录的写入权限,自然就报错失败了。

解决方案

要让重定向在本地执行而不是设备端,有两种靠谱的处理方式:

方案1:Java读取输出后写入本地(跨平台通用)

把命令拆成两部分,先执行adb获取设备时间的输出,再用Java代码把输出写入本地文件,彻底绕开系统shell的差异:

// 只执行adb shell date,不带重定向
Process process = Runtime.getRuntime().exec("adb shell date");

// 读取adb返回的输出内容
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder output = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
    output.append(line).append("\n");
}
reader.close();
process.waitFor();

// 将输出写入本地的date.txt文件
try (FileWriter writer = new FileWriter("date.txt")) {
    writer.write(output.toString());
} catch (IOException e) {
    e.printStackTrace();
}

方案2:指定shell解析命令(仅适配Mac/Linux)

如果坚持想用shell重定向的方式,在Mac上需要明确用sh -c包裹命令,让系统shell先解析重定向逻辑:

// Mac/Linux下用sh -c让shell处理重定向,避免adb接管
String command = "sh -c 'adb shell date > date.txt'";
Process process = Runtime.getRuntime().exec(command);

不过这种写法需要做操作系统判断,不如第一种方案的通用性强。

额外小提示

如果你的命令涉及管道、多重重定向这类复杂操作,优先选方案1,兼容性拉满,不用纠结不同系统的shell语法差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:54:46