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
相关产品推荐
相关产品推荐

