Procurando ajuda para escapar de "&" na linha de comando do ADB - qualquer orientação seria muito apreciada!
Estou tentando extrair arquivos de livros .epub de um tablet Android executando o aplicativo B&N Nook. O aplicativo NOOK armazena arquivos de e-book em "/data/data/bn.ereader/files/B&N Downloads/Books" A string "B&N Downloads" está causando problemas nos comandos shell do ADB. Já tentei escapar do "&" e do "espaço" das seguintes formas...
$ ./adb shell cd ./data/data/bn.ereader/files/B&N Downloads/Books (comando original)
$ ./adb shell cd ./data/data/bn.ereader/files/B\&N\ Downloads/ Livros
$ ./adb shell cd ./data/data/bn.ereader/files/'B&N Downloads'/Livros
$ ./adb shell cd './data/data/bn.ereader/files/B&N Downloads/Livros'
$ ./adb shell cd ./data/data/bn.ereader/files/"B&N Downloads"/Livros
$ ./adb shell cd ./data/data/bn.ereader/files/B^&N^ Downloads/Livros
(que último da sugestão em outra resposta: Tentando dar "&" como parte do adb shell input text )
sempre dando o mesmo erro...
/system/bin/sh: N: não encontrado
/system/bin/sh: cd: /data/data/bn.ereader/files/B: Arquivo ou diretório inexistente
Computador ADB:
MacBookPro 9,2 (meados de 2012)
Versão do sistema: macOS 10.14.6 (18G9323) "Mojave"
Versão do kernel: Darwin 18.7.0.
Dispositivo Android de destino:
B&N Nook HD+ (executando CyanogenMod)
Versão do Android: 7.1.1
Versão do kernel: 3.0.101 (dmaces@gc-xenial #1)
Número da versão: cm_ovation-userdebug 7.1.1 NMF26Q 161222 chaves de teste
Também tentei isso em um Lenovo Tab M10 Plus 3ª geração com os mesmos resultados:
Versão do Android: 12
Versão do kernel: 4.14.186-ga2e751134649
Número da compilação: TB125FU_S000118_220927_ROW
[NOTA: Concluí minha tarefa original simplesmente executando um "pull" de toda a maldita árvore de diretórios acima da pasta "B&N Downloads" do problema, mas a questão de como escapar de "&" permanece]
Veja o texto de entrada do shell post adb não leva o caractere & comercial .
A resposta aceita diz o seguinte:
Outra resposta foi:
hello1"&"hello2
.Ainda outra resposta observou isso:
A solução para este problema foi postada como um comentário por @davidgo ...
Escape duplo do caractere & - ou seja, \\\&, então o único escape & é passado para o shell, onde é escapado. Portanto, o comando é:
./adb shell cd ./data/data/bn.ereader/files/B\\\&N\\\ Downloads/Livros
Funciona muito bem!
A alternativa nº 2 que descobri é:
$ ./adb shell (que coloca o console no modo shell no dispositivo Android)
# cd data/data/bn.ereader/files/B\&N\ Downloads/Books/
Um bônus para a alternativa nº 2 é que o preenchimento automático de guias no Android agora também funciona. Cuidado: QUALQUER erro no modo de shell do Android parece interromper esse modo e retornar o controle do console ao terminal do cliente.