如何在 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'"
对于涉及通过 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'"