ADB环境中转义单引号:含单引号目录存在性检查问题
解决ADB检测含单引号目录的转义问题
我之前也踩过ADB命令里特殊字符转义的坑,尤其是单引号这种会被shell直接解析的符号,分享几个亲测有效的解决方案:
方案1:双层转义适配设备端Shell
如果是直接在终端执行命令,或者程序里拼接字符串命令,需要处理本地Shell和设备端Shell的双层解析:
- 用双引号包裹整个Shell命令,路径里的单引号用
\'转义,同时路径的双引号也要转义(因为外层是双引号)
示例命令:
adb shell "[ -d \"/storage/emulated/0/My\'Docs/Photos\" ] && echo true || echo false"
设备端Shell最终收到的路径会是/storage/emulated/0/My'Docs/Photos,能正确识别目录。
方案2:单引号嵌套转义技巧
这是Unix Shell通用的转义方法,用'\''来代替路径里的单引号,原理是:先闭合当前的单引号,插入一个转义的单引号,再重新打开单引号。
示例命令:
adb shell '[ -d '\''/storage/emulated/0/My'\''Docs'\''/Photos'\'' ] && echo true || echo false'
这个写法看起来有点绕,但能让设备端Shell正确解析出带单引号的路径。
方案3:代码中用参数化调用(最推荐)
如果是用程序(比如Python、Java)构建ADB命令,不要手动拼接字符串,用参数化的方式传递路径,让系统自动处理转义,完全避免Shell解析问题。
比如Python中用subprocess模块的写法:
import subprocess def adb_check_dir(adb_executable, target_dir): # 把命令拆分为列表,每个参数独立传递 cmd = [adb_executable, 'shell', 'test', '-d', target_dir] # test命令返回0表示目录存在,非0表示不存在 result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) return result.returncode == 0
调用这个函数时,直接传入带单引号的路径即可,比如adb_check_dir("adb", "/storage/emulated/0/My'Docs/Photos"),subprocess会自动处理特殊字符的转义,不会出现解析异常。
为什么之前的转义失败?
ADB命令会经过两层Shell解析:本地终端的Shell先解析一次,再把命令传给设备端的Shell解析。很多时候我们只处理了其中一层的转义,导致设备端收到的命令语法错误。而参数化调用的方式直接绕过了本地Shell的解析,把参数原封不动传给ADB,再传递给设备端,所以是最稳定的方案。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

