2013-03-07 10 views
5

Mam mały problem ze skryptem, który robię dla Androida. Nie mogę się połączyć, aby "EOF" działało w "mksh". Działa dobrze w "sh" i "bash", ale ponieważ "mksh" jest najczęściej wykorzystywany w Androidzie, naprawdę potrzebuję, aby działał we wszystkich.Android Shell EOF

cat <<EOF 
    ... lines here ... 
EOF 

tym przykładzie spowoduje błąd odłogowania

nie można utworzyć pliku tymczasowego /sqlite_stmt_journals/mksh.(random): Nie ma takiego pliku lub katalogu

widziałem inni z tym problemem, ale nie ma prawdziwego rozwiązania.

+0

nie widzę, co to ma wspólnego z moim numerze? Jest to problem związany z aplikacją związaną z Emulatorem, podczas gdy mój to problem z powłoką dotyczący mksh –

Odpowiedz

2

Cóż, jest takie oczywiste, choć nieprzyjemne rozwiązanie: nie korzystaj z dokumentacji TUTAJ; po prostu echo każdej linii do pliku tymczasowego. Twój przykład staje się następujący:

echo ... first line ... > $tmpfile 
echo ... subsequent lines ... >> $tmpfile 
cat $tmpfile 
rm $tmpfile 

EDYCJA: czekaj, co? Wygląda na to, że dokumentacja HERE działa dobrze na MKSH dla mnie. Poniższa występuje z mksh R39 na magazynie Kindle Fire HD (nie przeszkadza Perl):

$ perl <<FOO 
print "hi\n" 
FOO 
hi 
$ 

Twój przykład działa również jak będę oczekiwać.

+1

Dziękuję za odpowiedź, ale twój przykład nie działa na moim urządzeniu. Może to być problem z niektórymi wersjami mksh, ale będę musiał uruchomić go we wszystkich wersjach, ponieważ nie jest to coś, co powinno być uruchamiane tylko na moim własnym urządzeniu, w takim przypadku po prostu zamieniłbym mksh na bash. Szewuje, że jedynym działającym rozwiązaniem jest utworzenie brakującego folderu. Po prostu nie rozumiem, dlaczego jest to wymagane tylko przez mkfs, a nie sh i bash. –

+0

Jeśli jesteś w pozycji, w której możesz "echo ... pierwsza linia ...> $ tmpfile", możesz także ustawić TMPDIR na miejsce, w którym utworzyłeś $ tmpfile i użyć tutaj dokumentów, ponieważ mksh będzie śledzić i używać $ TMPDIR. Problem polega na tym, że obecnie nie ma rozsądnych wartości domyślnych dla $ TMPDIR, ale jest to problem platformy. – mirabilos

10

Problem pojawia się od/sqlite_stmt_journals stosowane do istnieć i być lepkie katalog zapisywalny jak/tmp w normalnych-em Unix więc stosować jako standardowy TMPDIR przy dodawaniu mksh Android.

Najnowsza polityka bezpieczeństwa Androida zabrania całkowicie katalogów z możliwością zapisywania na świat.

My (zespół Android i ja) zdajemy sobie sprawę z problemu, ale musimy jeszcze wymyślić rozwiązanie dobre; Katalogi domowe "użytkownika" powinny zostać utworzone, zanim będą mogły zostać (automatycznie) użyte, ale pracownik Google powiedział mi, że mają coś w kolejce.

Do tego czasu ustaw TMPDIR na coś, co można zapisać dla użytkownika.

To jest problem ze środowiskiem Android, a nie z mksh per se.

@Julian Fondren: Twoje urządzenie z systemem Android prawdopodobnie pochodzi z katalogu, w którym nadal istnieje.

W gitarze AOSP, domyślnym TMPDIR jest/data/local, który jest zapisywalny przynajmniej dla użytkownika root ... więc po prostu ustaw go jako zapisywalny dla ciebie (i wyeksportuj go, jeśli używasz skryptów) na teraz .

+0

Dzięki za pracę! – siesta

1

1) Jeśli masz uprawnienia root:

Po otwarciu android skorupę wtedy, jeśli masz uprawnienia administratora tego urządzenia, a następnie uruchomić adb jako użytkownik root.

adb root 

zamiast tylko

adb shell 

to rozwiąże problem.

2) czy można zmodyfikować plik binarny sh w urządzeniu android następnie zmodyfikować tak, że będzie go znaleźć ścieżkę

/data/local/tmp/ 

lub

/data/local/atvc/ // In Motorola’s android device. 

powyżej katalog ma odczytu/zapisu/wykonaj zezwolenie dla użytkownika powłoki.

3) zainstalować BusyBox i uruchom jakoBusybox cat <<EOF

0

z tego post:

package=com.tayek.tablet.gui.android.cb7 
cat <<EOF | adb -s 0a9196e8 shell 
run-as $package 
ls -l /data/data/$package 
exit 
exit 
EOF 
+0

Ten kod uruchamia 'HERE' dokumenty na komputerze-hoście, a następnie potokuje wynik do' powłoki adb', która jest nieistotna dla problemu OP –