DerKoenig Geschrieben 1. September 2008 Geschrieben 1. September 2008 Moin Moin, hat jemand ein Beispiel wie man ein Shellscript unter Java aurufen kann und anschließend das ausgelesene des Shellscriptes zurückbekommt ? sprich wenn ich ein Hello World als Shellscript hätte, dieses aufgerufen wird, ich ein "Hello World" in Java übergeben bekomme Zitieren
TDM Geschrieben 1. September 2008 Geschrieben 1. September 2008 Soll das Script das Programm aufrufen oder das Programm das Script um Daten zu bekommen? Beim ersteren einfach Kommandozeilenargumente, beim zweiteren plattformabhängig (im Regelfall aber meistens über eine Dateiumleitung) Zitieren
DerKoenig Geschrieben 1. September 2008 Autor Geschrieben 1. September 2008 also das betriebsystem = linux (redhat 4) das java programm stellt die grafische oberfläche da, über die eine ausgabe stattfinden soll also ruft das java programm ein shellscript auf welches die auszugebenden werte an das java programm übergeben soll ich hab bereits gehört dass es n icht möglich sein soll und man lediglich einen wert 1 oder 0 zurückbekommen kann welcher für das beenden bzw laufen des programmes steht. ist dies so ? Zitieren
TDM Geschrieben 1. September 2008 Geschrieben 1. September 2008 Nein, theoretisch gibts 0 zurück wenn ein Programm erfolgreich beendet wurde, ansonsten Non-Zero. nachschauen, was das Programm aber nun auswirft wird nicht so einfach, da es in die Konsole schreibt. Du kannst aber mit "script.sh >> datei" die ausgabe des scripts auf eine Datei umleiten und dann mittels Java auslesen + gewünschtes Ergebnis parsen. Aber wenns wirklich nur ein Script ist, würd ich das ehrlich gesagt nachprogrammieren. (Kommt aber auf den Umfang des Scripts an.) Zitieren
kein-tee Geschrieben 1. September 2008 Geschrieben 1. September 2008 Prozesse in Java lassen sich grundsätzlich über Runtime.exec oder den ProcessBuilder starten. Neben dem Rückgabewert des Prozesses, kannst du selbstverständlich auch die Standard-Ausgabe und Standard-Fehlerausgabe überwachen. Es ist auch möglich die Standard-Eingabe zu nutzen um Daten zu übergeben. Nähere Information hierzu findest du hier: Runtime.execProcessBuilderProcess Gruß Zitieren
DerKoenig Geschrieben 3. September 2008 Autor Geschrieben 3. September 2008 Hallo, danke erstmal für die Antworten @kein-tee hast du vielleicht ein simples Beispiel, wenn man zB das shellscript "Hello World" aufrufen möchte und einfach die Ausgabe des Scriptes in eine Variable speichern oder über ein System.out.println in Java ausgeben will ? wäre echt hilfreich danke im vorraus ^^ falls wer anders ein Beispiel hat wäre mir das auch recht thx und greez Zitieren
Dragon8 Geschrieben 3. September 2008 Geschrieben 3. September 2008 Da mich das jetzt auch mal interessiert hat, hier mal nen kleines Beispiel: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ProcessBuilderTest { public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder(new String[]{"<deinSkript>"}); try { Process p = pb.start(); BufferedReader in = new BufferedReader( new InputStreamReader((p.getInputStream()))); String line = null; while((line = in.readLine()) != null) System.out.println(line); } catch (IOException e) { e.printStackTrace(); } } } Das Programm ruft das Skript auf und leitet den gesamten Text aus der Standardausgabe des Skriptes an die Standardausgabe des Programms weiter. Zitieren
DerKoenig Geschrieben 3. September 2008 Autor Geschrieben 3. September 2008 vielen dank nur ganz kleines ein Verständnisproblem und zwar zur folgenden Zeile ProcessBuilder pb = new ProcessBuilder(new String[]{"<deinSkript>"}); dieses new String[]{} warum {} und was hat das zu bedeuten ^^ bin noch nie mit einer solchen Schreibweise oder mit einem solchen Ausdruck konfrontiert worden danke im vorraus =) Zitieren
Dragon8 Geschrieben 3. September 2008 Geschrieben 3. September 2008 Das ist einfach nur ne Kurzschreibweise um ein Array zu deklarieren und gleichzeitig mit Werten zu befüllen. Innerhalb der geschweiften Klammern stehen die Werte des Arrays. Und ein Arrays ist es deshalb, weil du nach dem namen noch Parameter angeben kannst, die an das Kommando übergeben werden. Wenn aber Java 1.5 oder höher benutzt kannste auch einfach die Strings ganz normal hintereinander wie bei einem normalen Methodenaufruf schreiben, also zB. so: ProcessBuilder pb = new ProcessBuilder("<deinSkript","<1. Parameter>","<2. Parameter>","<usw>"); Zitieren
DerKoenig Geschrieben 3. September 2008 Autor Geschrieben 3. September 2008 wollte das script grad mal testen, warum wird der ProcessBuilder bei mir angemakert, muss ich da noch irgendetwas importieren ?? Zitieren
kein-tee Geschrieben 3. September 2008 Geschrieben 3. September 2008 warum wird der ProcessBuilder bei mir angemakert Keine Ahnung, welche Fehlermeldung wird angezeigt? muss ich da noch irgendetwas importieren Nein. Der ProcessBuilder gehört zum 'java.lang' Package, du musst nichts importieren. Gruß Zitieren
DerKoenig Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 ProcessBuilder cannot be resolved to a type und er unterkringelt mir beide ProcessBuilder, habs einfach 1:1 kopiert von oben Zitieren
Dragon8 Geschrieben 4. September 2008 Geschrieben 4. September 2008 Kann es sein, dass du Java 1.4 benutzt? Ich habe ich jetzt auch erst beim zweiten drüber schauen gesehen, dass der ProcessBuilder erst ab Java 1.5 dazugehört. Zitieren
DerKoenig Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 das wird dann das Problem sein... hmm ... gibt es eine alternative ? weil ich kann scheinbar kein 1.5 nutzen da der aufwand zu groß wäre alle system upzudaten Zitieren
kein-tee Geschrieben 4. September 2008 Geschrieben 4. September 2008 gibt es eine alternative ? Runtime.exec Seit JDK 1.0 ... Gruß Zitieren
DerKoenig Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 aber mal noch ne andere frage ich hab den provessbuilder trotzdem mal ausprobiert und wenn ich statt <MeinSkript> einfach HelloWorld.sh eintrage bekomme ich folgende FehlerMeldung sry für mein Newbe wissen ^^ bin noch nicht all zu erfahren in dem Bereich java.io.IOException: Cannot run program "HelloWorld.sh": java.io.IOException: error=2, No such file or directory at java.lang.ProcessBuilder.start(Unknown Source) at ExecScript.main(ExecScript.java:13) ... das Skript liegt im selben Ordner... Zitieren
kein-tee Geschrieben 4. September 2008 Geschrieben 4. September 2008 (bearbeitet) das Skript liegt im selben Ordner... Benutzt du eine Entwicklungsumgebung?In welchem Ordner liegt das File? Andererseits, versuchs mal mit './HelloWorld.sh'. Gruß Bearbeitet 4. September 2008 von kein-tee Zitieren
DerKoenig Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 Ich nutze eclipse und das Script liegt im selben Verzeichnis auf den auch mein workspace zeigt und wo das java file liegt user/java/ Zitieren
DerKoenig Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 mit einfachen Anführungsstrichen geht es nicht da er ein String erwartet mit "./HelloWorld.sh" hab ich es bereits versucht, erfolglos ebenfalls mit ". HelloWorld.sh" Zitieren
kein-tee Geschrieben 4. September 2008 Geschrieben 4. September 2008 Dein Skript liegt wahrscheinlich an der falschen Stelle! Da du anscheinend unter Linux arbeitest, eine ganz einfache Lösung: Führe anstatt deinem Skript 'pwd' aus. Dir sollte dann das aktuelle Verzeichnis angezeigt werden. In diesem solltest du dann dein Skript kopieren. Einfach dann mit './' im ProcessBuilder ausführen und fertig. Gruß Zitieren
Dragon8 Geschrieben 4. September 2008 Geschrieben 4. September 2008 Also zum Verständnis, der Workspace den du in Eclipse angegeben hast ist "/user/java"? und genau in diesem Verzeichnis liegt auch dein Skript? Dann versuch mal bei "<MeinSkript>" "../HelloWorld.sh" einzutragen. Oder verschiebe die Skriptdatei einfach in deinen Projektordner. Zitieren
DerKoenig Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 meine vermutung ist, dass ich ersteinmal eine externe shell per java aufrufen muss ? sonst weiss er ja nicht wo ers ausführen soll ... oder ? also hab das script im selben ordner wie die class liegen wie ruf ich ein terminal auf ? wenn ichs richtig verstanden hab, kann ich ja die reihenfolge der befehle in dem string array angeben ? oder hab ich was missverstanden Zitieren
DerKoenig Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 schon erledigt ^^ ... danke an allle hat endlich geklappt =) thx @ all hab euch alle lieb :D Zitieren
kein-tee Geschrieben 4. September 2008 Geschrieben 4. September 2008 Ein bisschen Feedback wäre an dieser Stelle vielleicht etwas angebracht. Woran lag es? Wie hast du es zum laufen gebracht? Gruß Zitieren
DerKoenig Geschrieben 4. September 2008 Autor Geschrieben 4. September 2008 erstens muss das script im source ordner nicht in den class ordner zweitens wurde unter linux immernoch die falsche java version angesprochen,... so ist das wenn 2 installiert sind -.- ^^ Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.