Escapando caracteres ao passar argumentos para um comando

3

Eu regularmente gravo arquivos de áudio usando o meu telefone Android para arquivos WAV para o armazenamento interno do meu telefone. Eu gostaria de escrever um script Bash para puxar o arquivo gravado mais recente do meu telefone e movê-lo para o meu desktop. Aqui está o que eu tenho até agora:

adb shell find /storage/sdcard0/Sound\ Recordings/ | tail -1 | while read file ; do
    adb pull "$file" ~/Desktop/
done

No entanto, isso falha. Parece que o ADB não escape adequadamente das coisas e recebo as seguintes mensagens ao tentar executar o script:

' does not existstorage/sdcard0/Sound Recordings/20120817T065953.wav

Parece ignorar as aspas duplas e tudo basicamente quebra quando tenta rodar, já que presumivelmente vê 3 argumentos ao invés de dois, algo assim:

adb pull /storage/sdcard0/Sound Recordings/20120817T065953.wav ~/Desktop/

Como posso ajustar meu script para inserir barras invertidas na minha variável $file , quando necessário? Essa é a solução adequada neste caso?

    
por Naftuli Kay 03.09.2012 / 03:48

2 respostas

1

Como você está executando isso em outro nível de shell, ele é expandido antes de ser executado no subshell. A maneira mais fácil de corrigir isso é escapar de qualquer caractere especial no nome do arquivo:

adb shell find /storage/sdcard0/Sound\ Recordings/ | tail -1 | while IFS= read -r file ; do
    adb pull "$(printf %q "$file")" ~/Desktop/
done
    
por 03.09.2012 / 13:03
1

Esta é a solução:

adb pull "/storage/sdcard0/Sound Recordings/$(
    adb shell ls -1t '/storage/sdcard0/Sound Recordings' |
        sed q |
        tr -d '\r'
)" .

Você está enfrentando problemas porque adb retorna alguns retornos de carro, como o Windows \r

sed q é apenas uma maneira divertida de exibir a primeira ocorrência como head -n1

    
por 03.10.2012 / 14:39

Tags