2008-10-02 12 views
19

Chciałbym wywołać bash, używając łańcucha jako danych wejściowych. Coś jak:Używanie cudzysłowów w getRuntime(). Exec

sh -l -c "./foo" 

Chciałbym zrobić to z Java. Niestety, gdy próbuję wywołać komendę przy użyciu getRuntime().exec, pojawia się następujący błąd:

 foo": -c: line 0: unexpected EOF while looking for matching `"' 

     foo": -c: line 1: syntax error: unexpected end of file 

wydaje się być związane z moim ciąg nie jest zakończony EOF.

Czy istnieje sposób wstawienia konkretnego EOF platformy do ciągu Java? Czy powinienem szukać innego podejścia, np. Pisania do skryptu tymczasowego przed wywołaniem "sh"?

+0

Czy pojawia się błąd podczas kompilacji lub w czasie wykonywania? –

+0

Jaki jest kod Java użyty do wywołania bash? Łańcuchy używane w tym kodzie Java wydają się błędne. Niestety brakuje ich w poście, przez co nie jest szczególnie przydatny ... – oberlies

Odpowiedz

39

Użyj tego:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"}); 

Główny punkt: nie umieścić cudzysłów w Jest on używany tylko podczas pisania wiersza polecenia w powłoce.!

np echo "Hello, world!" (jak wpisany w powłoce) zostanie przetłumaczony na:.

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"}); 

(Zapomnij na chwilę, że powłoka ma zwykle polecenie wbudowane dla echo i dzwoni /bin/echo zamiast :-))

4

EOF nie jest postacią, więc nie można napisać EOF. Zapomniałeś zamknąć cytowany ciąg znaków.

0

Przyczyną tego błędu jest najprawdopodobniej brakujący token składni, którego oczekuje bash, ale ciąg, który mijamy, kończy się, zanim bash go napotkał. Poszukaj ifs, fors itp., Które nie mają zamknięcia lub zakończone.

0

Cytaty należy uciec, gdy znajdują się wewnątrz napisu. Zamiast pisać "write \".

E.g.

strcpy (c, "To jest ciąg \" z \ "cytatami");

7

Wiersze poleceń systemu Windows inaczej niż UNIX, Mac OS X i GNU/Linux.

W systemie Windows proces otrzymuje tekst wejściowy w postaci po wykonalnej nazwie (i spacji). Następnie program analizuje wiersz poleceń (co zwykle odbywa się w sposób niejawny, a programista często nie ma pojęcia).

W systemie GNU/Linux powłoka przetwarza wiersz polecenia i odbiera znaną tablicę łańcuchów przekazanych do głównej sieci C. Nie masz tej powłoki. Najlepszym podejściem (nawet w systemie Windows) jest użycie formy exec, w której każdy argument wiersza poleceń zostanie przekazany osobno w swoim własnym łańcuchu.

Możesz otrzymać powłokę do analizy, jeśli naprawdę chcesz. Które sprawiają, że przykład wyglądać (niesprawdzone):

Runtime.getRuntime().exec(new String[] { 
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\"" 
}); 
0

gdybym był tobą, chciałbym napisać treść napisu do bashfile temp i sprawdzić, czy wykonywany bash, że bez jakiegokolwiek błędu. Jeśli zostanie to wykonane bez błędu, rozważę dalsze debugowanie;

Powiązane problemy