Shell Script Aufruf mit Java

tk

Mitglied
Hallo,

kann mir jemand einen Tipp geben wie man ein Shell-Script unter Cygwin mit Java aufruft bzw. wie man überhaupt mehrere Befehle hintereinander aufruft?

Folgendes funktioniert so nicht:

Java:
Process p=Runtime.getRuntime().exec("C:\\cygwin\\bin\\bash --login -i -c sh test.sh <cmd>");


Grundsätzlich funktioniert es aber wenn beispielsweise nur ls abgefragt wird:

Java:
Process p=Runtime.getRuntime().exec("C:\\cygwin\\bin\\bash --login -i -c ls <cmd>");

Danke.
 
Vorweg: Ich schiesse ins Blaue. Ich kenne zwar shell und shellsripts aber den Aufruf uas java habe ich nie impementiert.

Warum
Code:
sh test.sh
? Ich weiss nicht ob der Aufruf mit 2 Parametern klar kommt

Setz doch das executable bit bei test.sh.
Und wenn test.sh nicht im suchpfad ist, empfiehlt sich der Aufruf z.B. mit ./test.sh, ~/test.sh oder was auch immer der Pfad zum file ist.
 
Danke.

Also nur test.sh funktionierte nicht, obwohl es im Suchpfad ist, dafür hat ./test.sh aber geklappt.

Noch eine Frage, in dem Shell-Script wird eine auch Textdatei verarbeitet, diese würde ich gern aus Java als Parameter an das Shell-Script mit übergeben. Wie würde dann der Aufruf aussehen?
 
Du stellst ???:L Ich kann nicht mal den Fall mit ls nachvollziehen 😀

Aufgrund der Pfade muss ich annehmen, dass du das Programm aus der Windowswelt startest.
Sollte das nicht aus einer cygwin shell gestartet werden?

"C:/cygwin/bin/bash --login -i -c ./test.sh <cmd>" (ja Pfade können auch mit / geschrieben werden)
"C:/cygwin/bin/bash --login -i -c ls <cmd>"

wie auch die aus der cygwinshell gestarteten Vanten mit
"bash --login -i -c ~/test.sh <cmd>";
"bash --login -i -c ls <cmd>";

führen alle zu einer IllegalMonitorStateException - auch wenn ich es aus einer cygwin shell starte.

Parameter übergibt man man beim Aufruf
Code:
test.sh parameter1 parameter2
und innerhalb des scriptes greift man mit $1 und $2 darauf zu. $0 ist der Name des scriptes

EDIT: Ich hab mich soeben überzeugt - manuell (cmd-box) klappt es auch aus der Windowswelt
 
Zuletzt bearbeitet:
Java:
 test.sh parameter1 parameter2
funktioniert so nur in der Konsole.

In der Java-Anweisung klappt das allerdings nicht:
Java:
 Process p=Runtime.getRuntime().exec("C:\\cygwin\\bin\\bash --login -i -c ./test.sh ./daten.txt <cmd>")

Irgendjemand eine Idee?
 
Eigentlich habe ich es dir ja vorgenmacht, aber ich kann auch mit dem Zaunpfahl winken.
WAS geht schief?
WAS passiert.

Ach noch was - was soll das <cmd> hinten an deinen Strings. Lass die mal weg.
Ach noch was - wie heisst denn das bash-Programm genau? Schau mal nach.

Vermutlich kommst du dann auch auf die Idee das mal so zu probieren.
übrigens waitFor ist wichtig, sonst werden Prozesse abgeschossen bevor sie Laufzeit bekamen.

Was nicht klappt ist die Parameterübergabe an das script - es erstellt mir ein file .txt, das heisst dass $1 leer ist

EDIT: Auch das ist gelöst:
Java:
	String command1 = "C:/cygwin/bin/bash.exe --login -i -c \"~/test.sh tilde\"";

Java:
import java.io.IOException;

public class Test {

	private static void execute(String pCmd) {
		System.out.println("Versuche " + pCmd + " auszuführen");
		try {
			Process p = Runtime.getRuntime().exec(pCmd);
			int retVal = p.waitFor();
			System.out.println("geschafft. Returnwert = " + retVal);
		} catch (IOException ioexp) {
			ioexp.printStackTrace();
		} catch (InterruptedException iexp) {
			iexp.printStackTrace();
		}
	}

	public static void main(String[] args) {
		String command2 = "C:/cygwin/bin/bash.exe --login -i -c ~/test.sh tilde";
		String command3 = "C:/cygwin/bin/bash.exe --login -i -c ./test.sh punkt";
		execute(command2);
		execute(command3);
	}
}

und test.sh:
Code:
#!/bin/sh
touch ~/$1.txt
 
Zuletzt bearbeitet:
Ja super danke. So hat es jetzt geklappt:

Java:
Process p=Runtime.getRuntime().exec("C:\\cygwin\\bin\\bash --login -i -c \"./test.sh equakes.txt\"");
 
Habe da jetzt noch ein Problem. Der Prozess wird ja wie oben beschrieben gestartet. Parameterübergabe funktioniert auch, jedoch läuft das Shell-Script nicht komplett durch.
Im Shell-Script soll mit wget etwas heruntergeladen werden und dann mit unzip entpackt werden. Doch der Download beginnt, wird aber nicht zu Ende geführt, bis die Ausführung in Java abgebrochen wird.

Habe noch den Hinweis gefunden, das man die Streams schließen soll sonst blockiert waitFor() alles.

Java:
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();

process.waitFor()

Jetzt wird zumindest alles richtig heruntergeladen, das entpacken mit unzip funktioniert allerdings immer noch nicht.

Hat jemand eine Idee, es scheint ja an Java zu liegen, da das Shell-Script in der Konsole funktioniert. Danke.
 

Zurück
Oben