Eu tenho um script de shell simples para executar no shell adb Android.
while true; do
read var1
echo $var1 > /data/local/tmp/debug.txt
am force-stop $var1
done
Funciona bem se eu inserir um valor no console da instância original do shell. Mas se eu abrir outro shell adb e tentar passar dados para o primeiro processo:
echo "com.package.name" > /proc/XXXX/fd/0
onde XXXX é o pid do primeiro shell, vejo apenas que a string "com.package.name" chega no primeiro shell read
, mas nem depurar echo
linha, nem am
linha é executada. Esse é o script parece esperar por algo, talvez um caractere de nova linha, mas adicionando \n
, -e
argumento, e outras coisas na segunda entrada shell não ajudou.
Como faço para passar corretamente os dados entre os scripts de shell?
Respostas:
Você está sendo assaltado pelo conceito usual, que tudo em um sistema Linux é um arquivo . Para ilustrar isso, coloquei seus comandos em um arquivo chamado
forever
, em seguida, encontrou o PID do processo, entãoIsso mostra que seus descritores de arquivo 1,2,3 são arquivos de caractere. Agora, é bem conhecido (veja por exemplo esta resposta no Unix e no Linux ) naquela:
Então você precisa de outra maneira de realizar o IPC (= Inter Process Communication). No Unix e no Linux , há pipes nomeados por esta. Modifique seu script da seguinte maneira:
Inicie o script; de outro tipo de terminal
De um terceiro terminal, usando
tail -f /tmp/debug.txt
, você verá o que acabou de digitar no segundo terminal, reaparecer/tmp/debug.txt
.No Android , a situação é um pouco mais complexa, mas você vai encontrar Aqui e Aqui duas maneiras distintas em torno do problema de criar pipes nomeados em um dispositivo Android não enraizado (o primeiro é mais simples que o segundo).
fonte
cat > /tmp/my_pipe
ao invés decat /tmp/my_pipe
? Ou estou apenas sentindo falta de algo diferente neste ambiente?