如何在 bash 中转义嵌套的 ADB shell 命令

How to escape a nested ADB shell command in bash

对于涉及通过 ADB shell 以用户 ceres 身份发出 dconf 命令的 bash 脚本,我需要嵌套多个命令。 手动顺序执行以下三个命令完美无缺。

adb shell
su ceres
dconf write /desktop/asteroid/watchface "'file:///usr/share/asteroid-launcher/watchfaces/$opt.qml'"

我学会了转义 dconf 关键字以在 su ceres -c '<command>' 中正确嵌套 dconf。

su ceres -c 'dconf write /desktop/asteroid/watchface \"'file:///usr/share/asteroid-launcher/watchfaces/$opt.qml'\"'

如何将上述命令嵌套和转义到 adb shell "<command>"

adb shell "su ceres -c 'dconf write /desktop/asteroid/watchface \"'file:///usr/share/asteroid-launcher/watchfaces/$opt.qml'\"'"

当从 bash 脚本发出时,dconf 回复 error: 0-4:unknown keyword

感谢您的帮助和解释!

对于极端嵌套的情况,我会坚持使用 printf %q 而不是手动引用:

#! /usr/bin/env bash
printf -v cmd %q "'file:///usr/share/asteroid-launcher/watchfaces/$opt.qml'"
printf -v cmd %q "dconf write /desktop/asteroid/watchface $cmd"
adb shell "su ceres -c $cmd"

据推测,adb shell 从标准输入读取。您可以使用此处文档来简化此操作(以及使用 sudo 执行 adb shell 而不是使用 su):

sudo -u ceres adb shell <<EOF
dconf write /desktop/asteroid/watchface "file:///usr/share/asteroid-launcher/watchfaces/$opt.qml"
EOF

如果没有,无论如何这可能更简单,

sudo -u ceres adb shell -c "dconf write /desktop/asteroid/watchface 'file:///usr/share/asteroid-launcher/watchfaces/$opt.qml'"