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

如何在bash中转义嵌套的ADB shell命令,bash,escaping,adb,su,Bash,Escaping,Adb,Su,对于涉及通过ADB shell以用户ceres的身份发出dconf命令的bash脚本,我需要嵌套多个命令。 以下三个命令的手动顺序执行工作完美无瑕 adb shell su ceres dconf write /desktop/asteroid/watchface "'file:///usr/share/asteroid-launcher/watchfaces/$opt.qml'" 我学会了转义dconf关键字,以便在suceres-c'中正确嵌套dconf 如何将上述命令

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

adb shell
su ceres
dconf write /desktop/asteroid/watchface "'file:///usr/share/asteroid-launcher/watchfaces/$opt.qml'"
我学会了转义dconf关键字,以便在
suceres-c'
中正确嵌套dconf

如何将上述命令嵌套并转义到
adb shell”“

从bash脚本发出时,会导致dconf reply
错误:0-4:未知关键字


谢谢你的帮助和解释

对于极端嵌套的情况,我会坚持使用
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外壳
读取标准输入。您可以使用here文档来简化此过程(以及使用
sudo
执行
adb shell
,而不是使用
su
):


伟大的让它工作起来。谢谢你发布准确的命令。查看刚才的
manprintf
以便更好地理解。@TimoKönnecke小心。有多个
printf
s。并非所有独立版本(记录在
man printf
中)都支持
%q
,并且没有一个可以支持
-v
。我这里的意思是
printf
内置在
bash
中。您可以在
help printf
中阅读它的文档。因为脚本可能会有一些用户,所以我会记住,在某些非bash用户无法使用它的情况下。再次感谢你!ADB传输在脚本中仅为可选/回退。大多数用户将使用我可以嵌套的ssh/scp方法。我不希望在执行脚本的主机上使用sudo。我假设它将被普通用户使用,这些用户可能没有在他们正在执行它的机器上授予root权限。我们的目标是创建一个脚本,将watchfaces从加载到连接的AsteroidOS手表,为最终用户增加一点便利。还是谢谢你!很高兴学习。电脑上的sudo不会影响安卓设备。此外,根本没有sudo,你从来没有提到过这是一台PC(尽管我不知道adb实际上在做什么)
adb shell "su ceres -c 'dconf write /desktop/asteroid/watchface \"'file:///usr/share/asteroid-launcher/watchfaces/$opt.qml'\"'"
#! /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"
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'"