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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:55:23