Quando adbo em um dispositivo com Cyanogenmod, recebo um bom shell bash, prompt de cores e bashrc. Não vejo um link simbólico de / system / xbin / bash para / system / bin / sh. Como eles definem o shell padrão para bash em vez de sh? Procurei nos arquivos rc, mas não encontrei nada. Gostaria de fazer o mesmo na minha versão do Android, que não é o Cyanogenmod.
Atualizar
Depois de reinstalar do zero com o CM7, sou levado ao sh em vez do bash. Agora a questão é como definir o bash como padrão.
cyanogenmod
bash
Ravi
fonte
fonte
sh
, nãobash
, quando eu uso adb para se conectar. Qual versão você está usando?Respostas:
Quando
adb shell
é executado, o lado do Android também lança adb, que é executado/system/bin/sh -
. Esse caminho é codificado emsystem/core/adb/services.c
:Se você quiser alterar isso para o bash, precisará recompilar.
É possível executar alguns comandos do arquivo ao executar o shell interativo. Como escrito em
system/core/sh/main.c
,sh -
(note o-
para o modo interativo) lê os seguintes arquivos (nesta ordem):/etc/profile
.profile
(em relação ao diretório atual, é/.profile
paraadb shell
$ENV
(a variável de ambienteENV
deve apontar para um arquivo)Como
/etc/
e/
são somente leitura, a única maneira de carregar algo foi configurandoENV
. Provavelmente, você pode criar um link simbólico de/etc/profile
para/data/profile
montando a/
leitura e gravação (exercício para o leitor).fonte
Eu não tinha meu Android comigo agora para testar, mas com o Emulador de terminal Android, se você for ao menu, poderá usar a opção "Linha de comando" ou "Comando inicial".
fonte
Esta é uma pergunta antiga, mas recentemente fiquei curioso sobre isso. Encontrei um método que não requer recompilação
adbd
, mas requersu
(estou usando o Chainfire SuperSu 2.45).Assumindo que
bash
está localizado em/system/bin/bash
, esu
está em/system/xbin/su
, é essencialmente algo como isto:adb shell
(use um shell interativo. Invocar esse processo como uma linha pode fazer com que o ADB pare de funcionar se houver um problema)mount -o remount,rw /system
mv /system/bin/sh /system/bin/sh.bak
echo -e '#!/system/bin/bash\n/system/xbin/su -mm -l -s /system/xbin/bash' > /system/bin/sh
Observe que seus caminhos podem ser diferentes; usewhich bash
ewhich su
para ter certeza.chmod 777 /system/bin/sh
/system/bin/sh
. Se você receber um erro, corrija o erro ou reverter, restaurando o backup:cp /system/bin/sh.bak /system/bin/sh
.mount -o remount,ro /system
E você terminou.
Simplesmente ligar o BASH ao SH não funciona porque o bash emula o SH quando invocado dessa maneira.
No entanto, observando o strace, parece procurar um
bashrc
quando um BASH vinculado é chamado como 'sh --login'. Embora isso possa ser usado para "carregar em cadeia" shells via script, como mencionado acima, a maneira como oadbd
SH é codificado é codificado.Se houver um problema e você tiver removido (ou movido) o
/system/bin/sh
ADB não terá um shell para ajudá-lo a corrigir o problema. Se isso acontecer, você tem algumas opções:adbd
(como CWM ou TWRP) e abra um shell adb para copiar /system/bin/sh.bak em / system / bin / sh novamente.adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh
observe que isso não funcionará em todos os dispositivos; alguns se recusam a permitir que o adb remonte / rw do sistema dessa maneira.fonte
No seu PC, obtenha um binário do bash e substitua
/system/bin/sh
. Eu tenho um aqui .Sinta-se livre para copiar este código:
fonte