2008-10-02 9 views
19

Ich möchte bash mit einer Zeichenfolge als Eingabe aufrufen. Etwas wie:Verwenden von Anführungszeichen in getRuntime(). Exec

sh -l -c "./foo" 

Ich möchte dies von Java tun. Leider, wenn ich versuche, den Befehl getRuntime().exec aufzurufen, erhalte ich folgende Fehlermeldung:

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

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

Es scheint meine String bezogen werden nicht mit einem EOF beendet wird.

Gibt es eine Möglichkeit, eine plattformspezifische EOF in eine Java-Zeichenfolge einzufügen? Oder sollte ich nach einem anderen Ansatz suchen, wie in ein temporäres Skript schreiben, bevor "sh" aufgerufen wird?

+0

Erhalten Sie den Fehler zur Kompilierzeit oder zur Laufzeit? –

+0

Was ist der Java-Code, den Sie zum Aufruf von bash verwendet haben? Die Zeichenfolgen, die Sie in diesem Java-Code verwenden, scheinen falsch zu sein. Leider fehlen sie in der Post und machen es nicht besonders nützlich ... – oberlies

Antwort

39

Verwendung:

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

Hauptpunkt: nicht setzen die doppelten Anführungszeichen in Das wird nur verwendet, wenn eine Befehlszeile in der Shell zu schreiben.!

zB echo "Hello, world!" (wie in der Shell eingegeben) wird an übersetzt.

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

(Nur für den Moment vergessen, dass die Schale normalerweise einen eingebauten für echo hat, und /bin/echo stattdessen ruft :-))

4

EOF ist kein Zeichen, daher gibt es keine Möglichkeit, ein EOF zu schreiben. Sie haben vergessen, eine Zeichenfolge in Anführungszeichen zu schließen.

0

Die Ursache für diesen Fehler ist höchstwahrscheinlich ein fehlendes Syntax-Token, das bash erwartet, aber die übergebene Zeichenfolge endet, bevor bash sie gefunden hat. Suchen Sie nach Wenn, Fors usw., die nicht schließen oder getan haben. diese

0

Quotes müssen in einer Zeichenfolge maskiert werden. Anstatt "Schreiben" zu schreiben.

z.

strcpy (c, "Dies ist ein String \" mit "Anführungszeichen");

7

Windows-Befehlszeilen anders als UNIX, Mac OS X und GNU/Linux.

Unter Windows erhält der Prozess den Eingabetext wie nach dem ausführbaren Namen (und Leerzeichen). Es liegt dann an dem Programm, die Befehlszeile zu parsen (was normalerweise implizit geschieht und der Programmierer oft ahnungslos ist).

In GNU/Linux verarbeitet die Shell die Befehlszeile und erzeugt das bekannte Array von Strings, die an Cs Haupt übergeben werden. Du hast diese Shell nicht. Der beste Ansatz (auch unter Windows) besteht darin, die Form von exec zu verwenden, bei der Sie jedes Befehlszeilenargument einzeln in einer eigenen Zeichenfolge übergeben.

Sie können eine Shell zum Parsen für Sie bekommen, wenn Sie wirklich wollten. Die Sie beispielsweise so etwas wie (ungetestet) aussehen würde:

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

wenn ich du wäre, ich den Inhalt der Zeichenfolge in ein temporäres bashfile schreiben und sehen, ob bash, dass jeder Fehler ohne ausführt. Wenn das ohne einen Fehler ausgeführt wird, würde ich das Debugging weiter in Erwägung ziehen;

Verwandte Themen