Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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)

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 ?

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.)

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:

Gruß

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

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.

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 =)

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>");

wollte das script grad mal testen, warum wird der ProcessBuilder bei mir angemakert, muss ich da noch irgendetwas importieren ??

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ß

ProcessBuilder cannot be resolved to a type und er unterkringelt mir beide ProcessBuilder, habs einfach 1:1 kopiert von oben

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

gibt es eine alternative ?

Seit JDK 1.0 ...

Gruß

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...

das Skript liegt im selben Ordner...

  • Benutzt du eine Entwicklungsumgebung?
  • In welchem Ordner liegt das File?

Andererseits, versuchs mal mit './HelloWorld.sh'.

Gruß

Bearbeitet von kein-tee

Ich nutze eclipse und das Script liegt im selben Verzeichnis auf den auch mein workspace zeigt und wo das java file liegt

user/java/

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"

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ß

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.

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

schon erledigt ^^ ... danke

an allle hat endlich geklappt =) thx @ all

hab euch alle lieb :D :D :D

Ein bisschen Feedback wäre an dieser Stelle vielleicht etwas angebracht. Woran lag es? Wie hast du es zum laufen gebracht?

Gruß

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 -.- ^^

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.