如何在Shell脚本的adb shell内执行命令?am broadcast执行异常求助
解决adb shell外部执行am broadcast命令无效问题
问题原因
核心问题是外部Shell对命令中的JSON字符串进行了不必要的转义解析,导致最终传入adb shell的命令和你在adb内部直接执行的内容不一致。原命令中的引号和JSON结构在外部Shell环境下被拆分,使得am broadcast无法正确识别参数。
解决方案
以下是几种可靠的修复方式,可按需选择:
方法1:用单引号包裹完整adb shell命令
将整个需要在adb内部执行的命令用单引号包裹,阻止外部Shell解析内部的引号和JSON结构。注意内部的单引号需要用'\''转义:
adb shell 'am broadcast -a amazon.speech.ROUTE_DIRECTIVE --es directive '\''{"directive": {"header": {"namespace": "Alexa.Networking.WiFi","name": "GetProfiles","messageId": "123e4567-e89b-12d3-a456-426652350006","correlationToken": "1234"},"payload": {}}}'\'''
方法2:通过临时脚本执行
把am broadcast命令写入临时脚本,推送到设备后执行,完全规避外部Shell的转义问题:
# 创建本地临时脚本 cat > broadcast_cmd.sh << 'EOF' am broadcast -a amazon.speech.ROUTE_DIRECTIVE --es directive '{"directive": {"header": {"namespace": "Alexa.Networking.WiFi","name": "GetProfiles","messageId": "123e4567-e89b-12d3-a456-426652350006","correlationToken": "1234"},"payload": {}}}' EOF # 推送到设备并执行 adb push broadcast_cmd.sh /data/local/tmp/ adb shell chmod +x /data/local/tmp/broadcast_cmd.sh && adb shell /data/local/tmp/broadcast_cmd.sh # 清理临时文件 adb shell rm /data/local/tmp/broadcast_cmd.sh rm broadcast_cmd.sh
方法3:修改原脚本
将原脚本中的am broadcast行替换为方法1的命令,完整脚本如下:
#!/bin/bash echo adb shell wpa_cli list_n all sleep 2 echo adb shell 'am broadcast -a amazon.speech.ROUTE_DIRECTIVE --es directive '\''{"directive": {"header": {"namespace": "Alexa.Networking.WiFi","name": "GetProfiles","messageId": "123e4567-e89b-12d3-a456-426652350006","correlationToken": "1234"},"payload": {}}}'\''' sleep 80 echo adb shell logcat -v time -b all | grep -i "getprofile" sleep 10
内容的提问来源于stack exchange,提问作者Mambo
相关产品推荐
相关产品推荐

