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

从macOS应用调用ADB脚本截取Android设备/模拟器截图时遭遇只读文件系统错误的技术问询

问题分析与解决方案

这个问题我之前帮朋友排查过,核心差异其实出在终端和macOS应用的默认工作目录权限不同,和ADB本身、设备端路径关系不大。

你在终端运行脚本时,默认的工作目录是你的用户目录(比如~/Desktop或者~/Documents),这些路径都是你有写入权限的,所以adb pull能正常把截图保存到当前目录。但macOS应用默认的工作目录通常是系统级的只读路径(比如根目录/,或者应用包内部的Contents目录),当你在应用里执行adb pull不指定本地目标路径时,它会尝试把文件写到这个只读目录里,自然就会抛出Read-only file system的错误——这也是为什么你换设备端的截图存储位置没用,问题根本不在设备那边。

验证这个猜想的方法

你可以在脚本里加一行打印当前工作目录的命令:

echo "Current working directory: $(pwd)"

分别在终端和你的macOS应用里运行脚本,对比输出的路径,就能看到明显差异。

解决方法

有两种简单的修复方式:

  1. 指定明确的本地可写路径
    修改你的adb pull命令,直接指定要保存截图的本地路径(确保这个路径是应用有权限写入的,比如用户的Documents或Downloads目录)。比如利用你脚本里的$PATH参数(注意这里的PATH变量名容易和系统环境变量冲突,建议后续改成LOCAL_PATH这类更清晰的名字):

    $ADB -s "$DEVICE" pull "/sdcard/${FILENAME}" "$PATH/${FILENAME}"
    

    只要$PATH对应的是一个你有写入权限的路径,就能解决问题。

  2. 先切换到可写工作目录
    在脚本开头先切换到一个确定的可写目录,比如用户的文档目录:

    cd ~/Documents || exit 1
    

    之后再执行adb pull命令,它就会默认把文件保存到这个目录里,不会再触发只读错误。

另外提醒一下:虽然你已经关闭了沙箱和强化运行时,但macOS应用的工作目录默认还是和终端不同,这是系统的默认行为,和沙箱无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:43:12