2

adb shell su -c is a commonly used adb command. Normally you just need to append arguments to the command line like this:

adb shell su -c echo ab

However, things can be tricky if you want to add quotes. For example, to print a b (there are 2 spaces), these won't work:

adb shell su -c echo "a  b"
adb shell su -c "echo \"a  b\""
adb shell su -c "echo 'a  b'"

You have to use these:

adb shell su -c "\"echo \\\"a  b\\\"\""
adb shell "su -c \"echo \\\"a  b\\\"\""
adb shell su -c "\"echo 'a  b'\""
adb shell "su -c \"echo 'a  b'\""

I'd like to know which is the standard way of writing such a command. Standard means it handles quotes correctly and in the most straightforward way.

My current research:

  • adb handles command arguments the same way as ssh: Arguments are connected (with space) into a string, and that string is executed.

  • su -c expects a single string as the command line, and it doesn't do the concatenation for you.

So I think the most standard way of writing adb shell su -c should be like:

adb shell "su -c \"echo \\\"a  b\\\"\""

However, I'm not very confident about this. Does anyone have concrete reference confirming what I'm doing or showing I'm doing it wrong?

1
  • When I get in this kind of situation I do: adb shell 'su -c "echo a\ \ b"'. I use single quotes to enclose everything after adb shell and double quotes inside, wherever needed.
    – Firelord
    Commented Sep 17, 2018 at 14:23

1 Answer 1

1

The best solution would be to use single-quotes (') around the subcommand:

adb shell 'su -c echo "a  b"'

But please note that usually within single-quotes everything is taken literally and variables are not expanded. This doesn't apply when you nest quotes like this. As an example:

myvar='123'
echo "$myvar"   # prints 123
echo '$myvar'   # prints $myvar

But: (assuming $myvar is set to '123' within the adb shell (e.g. on phone))

adb shell 'su -c echo "$myvar"'    # prints 123

In case you want to use your own shell variables to be included within the adb subcommand, you can simply flip around the quotes:

myvar='test'
adb shell "su -c echo '$myvar'"    # prints test

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .