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 ~/