Frage

Ich möchte bash mit einem String als Eingabe aufzurufen. So etwas wie:

sh -l -c "./foo"

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

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

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

Es scheint meinen String bezogen wird nicht mit einem EOF beendet wird.

Gibt es eine Möglichkeit, eine Plattform-spezifische EOF in ein Java-String einfügen? Oder sollte ich für einen anderen Ansatz suchen, wie in ein temporäres Skript zu schreiben, bevor „sh“ Aufruf?

War es hilfreich?

Lösung

verwenden:

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

Der Hauptpunkt:.! Nicht die doppelten Anführungszeichen in setzt Das ist nur dann verwendet, wenn eine Befehlszeile in der Shell zu schreiben

.

z, echo "Hello, world!" (wie in der Shell eingegeben) wird übersetzt:

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

(Vergessen Sie für den Moment, dass die Schale normalerweise einen eingebauten für echo hat, und ruft /bin/echo statt: -.))

Andere Tipps

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

Unter Windows erhält der Prozess die Eingabe von Text, wie nach dem executeable Namen ist (und Raum). Es ist dann auf das Programm, um die Befehlszeile zu analysieren (die in der Regel implizit gemacht wird und der Programmierer ist oft ahnungslos).

In GNU / Linux die Shell die Befehlszeile verarbeitet und gnereates die bekannte Array von Strings bis C Haupt weitergegeben. Sie haben nicht diese Schale. Der beste Ansatz (auch unter Windows) ist die Form von exec zu verwenden, wo Sie jedes Befehlszeilenargument einzeln in seinem eigenen String übergeben.

Sie können eine Schale zum Parsing für Sie, wenn Sie wirklich will. Was du Beispiel etwa so aussehen (ungetestet) machen würde:

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

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

Die Ursache für diesen Fehler ist höchstwahrscheinlich eine fehlende Syntax Token dass bash erwartet, aber die Zeichenfolge, die Sie Ende passieren, bevor es bash angetroffen. Suchen Sie nach ifs, fors usw., die keinen Schließ fi haben oder getan.

müssen Zitate entkommen werden, wenn in einem String. Statt zu schreiben "write \".

z.

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top