从macOS应用调用ADB脚本截取Android设备/模拟器截图时遭遇只读文件系统错误的技术问询
这个问题我之前帮朋友排查过,核心差异其实出在终端和macOS应用的默认工作目录权限不同,和ADB本身、设备端路径关系不大。
你在终端运行脚本时,默认的工作目录是你的用户目录(比如~/Desktop或者~/Documents),这些路径都是你有写入权限的,所以adb pull能正常把截图保存到当前目录。但macOS应用默认的工作目录通常是系统级的只读路径(比如根目录/,或者应用包内部的Contents目录),当你在应用里执行adb pull不指定本地目标路径时,它会尝试把文件写到这个只读目录里,自然就会抛出Read-only file system的错误——这也是为什么你换设备端的截图存储位置没用,问题根本不在设备那边。
验证这个猜想的方法
你可以在脚本里加一行打印当前工作目录的命令:
echo "Current working directory: $(pwd)"
分别在终端和你的macOS应用里运行脚本,对比输出的路径,就能看到明显差异。
解决方法
有两种简单的修复方式:
指定明确的本地可写路径
修改你的adb pull命令,直接指定要保存截图的本地路径(确保这个路径是应用有权限写入的,比如用户的Documents或Downloads目录)。比如利用你脚本里的$PATH参数(注意这里的PATH变量名容易和系统环境变量冲突,建议后续改成LOCAL_PATH这类更清晰的名字):$ADB -s "$DEVICE" pull "/sdcard/${FILENAME}" "$PATH/${FILENAME}"只要
$PATH对应的是一个你有写入权限的路径,就能解决问题。先切换到可写工作目录
在脚本开头先切换到一个确定的可写目录,比如用户的文档目录:cd ~/Documents || exit 1之后再执行
adb pull命令,它就会默认把文件保存到这个目录里,不会再触发只读错误。
另外提醒一下:虽然你已经关闭了沙箱和强化运行时,但macOS应用的工作目录默认还是和终端不同,这是系统的默认行为,和沙箱无关。
内容的提问来源于stack exchange,提问作者netdigger

