Como posso avaliar o resultado de um comando adb shell?

1

Por exemplo, quero verificar se existe um diretório no telefone.

R=$(adb shell 'ls /mnt/; echo $?' | tail -1);

$ echo $R
0

$ if [ "$R" -ne 0 ]; then echo "Path doesn't exist"; else echo "Path exists"; fi
: integer expression expected
Path exists

O que há de errado com R? Ok, tente com outra variável que é definitivamente 0.

$ x=0
$ if [ "$x" -ne 0 ]; then echo "Path doesn't exist"; else echo "Path exists"; fi

Path exists

$ echo "|$x|"
|0|

$ echo "|$R|"
|0

O segundo tubo não é impresso. Existe um caractere após 0? Tente cortar:

$ R=$(adb shell 'ls /mnt/; echo $?' | tail -1 | xargs)
$ echo "|$R|"
|0

Estou sem ideias.

    
por ka3ak 17.08.2017 / 09:46

2 respostas

6

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
    
por 17.08.2017 / 10:18
0

A outra resposta faz um bom trabalho explicando onde o consulente deu errado.  A moral da história é desconfiar da contagem de personagens, já que adb pode acrescentar alguns.

Acabei fazendo isso

R=$(adb shell 'ls /mnt && echo SUCCESS || echo FAIL' | egrep (SUCCESS|FAIL))
echo $R
    
por 21.06.2018 / 17:54