adb pull não aceitando uma variável como fonte, dá * 'não existe .. * erro

3

Estou tentando usar $ EXTERNAL_STORAGE no comando adb pull . Notei que a variável tem seu escopo definido apenas no Android e, portanto, não funcionaria com sucesso em adb pull $EXTERNAL_STORAGE/Pictures/Screenshots/ ~/ .

Claro, posso escrever um caminho absoluto para buscar todas as capturas de tela, mas o problema é outra coisa.

Eu tentei:

af=$(adb shell echo \$EXTERNAL_STORAGE/Pictures/Screenshots/)
adb pull $af ~/

que me dá o erro:

' does not existstorage/sdcard0/Pictures/Screenshots/

Como alternativa, se eu fizer isso:

af="/storage/sdcard0/Pictures/Screenshots/"
adb shell $af ~/

as capturas de tela são obtidas com sucesso.

Existe uma diferença na contagem de caracteres. Para o primeiro caso em que $ af recebe entrada de adb shell , a saída de ${#af} e echo $af | wc -c é 39 e 40, respectivamente.

Para o segundo caso em que uma string direta é inserida em $ af, a saída de ${#af} e echo $af | wc -c é 38 e 39, respectivamente.

Eu pensei que isso pode ser um resultado do espaço à direita, então eu adicionei um espaço no $af=/storage/sdcard0/Pictures/Screenshots/ " mas adb pull $af ~/ ainda funcionou bem.

Além disso, executei echo $af | fold -w1 | wc -l e, para ambos os casos, a saída é 38.

Então, o que está causando o ADB a lançar esse erro?

Se for importante, estou usando o Slackware 14.1 e o Android 4.2.1 e 5.0.2 com root.

    
por Firelord 26.08.2015 / 10:45

1 resposta

3

Você estava quase lá com sua primeira tentativa. O problema é que adb adiciona um retorno de carro no final de cada linha. Você não pode vê-lo no uso básico, onde a saída é impressa no terminal, porque um retorno de carro no final de uma linha não tem efeito visual (o retorno do carro move o cursor para o início da linha atual, mas a nova linha move o cursor para o começo da próxima linha).

Quando você armazena a saída em uma variável, o retorno de carro está lá em $af e, em seguida, adb pull a trata como parte do nome do arquivo. A mensagem de erro parece estranha devido ao retorno de carro no meio, o que faz com que a segunda metade da mensagem substitua a primeira metade.

Remova o retorno do carro antes de usar a variável.

af=$(adb shell 'echo "$EXTERNAL_STORAGE/Pictures/Screenshots/"')
af=${af%$'\r$}
adb pull "$af" ~/

ou diretamente

adb pull "$(adb shell 'echo "$EXTERNAL_STORAGE/Pictures/Screenshots/"' | tr -d '\r')" ~/

ou

adb pull "$(adb shell 'echo "$EXTERNAL_STORAGE"' | tr -d '\r')/Pictures/Screenshots/" ~/

Como alternativa, declare o retorno de carro como um separador de palavras e deixe a variável af sem aspas. Isso só funciona se $af não contiver espaço em branco.

IFS+=$'\r'
adb pull $(adb shell 'echo "$EXTERNAL_STORAGE/Pictures/Screenshots/"') ~/

Como alternativa, crie um link simbólico com um nome de sua escolha em vez de confiar na variável de ambiente.

adb shell 'ln -s "$EXTERNAL_STORAGE" /external-storage'

de uma vez por todas, para copiar arquivos

adb pull /external-storage/Pictures/Screenshots ~/

Com o link simbólico, você pode evitar a linha de comando adb e usar adbfs para montar o sistema de arquivos Android.

mkdir -p ~/mnt/android
adbfs ~/mnt/android
cp -Rp ~/mnt/android/Pictures/Screenshots ~/
    
por 27.08.2015 / 02:43