adb
está adicionando um retorno de carro (também conhecido como 0x0d
, Ctrl-M
, \r
, etc) antes da linha de alimentação. Provavelmente, para facilidade de uso com o software Windows, que espera que as linhas terminem com CR-LF, em vez de apenas LF.
Você mesmo pode ver isso com hexdump
aka hd
, por exemplo:
$ printf "$R" | hd
00000000 30 0d |0.|
00000002
Porque você só precisa retornar um único valor (o código de saída). você pode usar printf
em vez de echo
e redirecionar toda a saída de ls
para /dev/null
no dispositivo Android para evitar a impressão de novas linhas (então, o adb não adiciona um CR):
R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; printf $?')"
Se o seu dispositivo Android não tiver printf
ou se você precisar retornar uma ou mais linhas de saída de um shell do Android, poderá usar tr -d '\r'
ou dos2unix
ou sed 's/\r$//'
ou semelhante a tira o CR.
dos2unix
e sed
são melhores opções do que tr
aqui, porque eles apenas removerão CRs que são imediatamente seguidos por LF, deixando apenas CRs que possam estar em outro lugar em uma linha:
$ R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; echo $?' | dos2unix)"
$ printf "$R" | hd
00000000 30 |0|
00000001