Wie lassen sich in Java-Anwendungen Shellskripts ausführen?v.5.0
Das Beispiel demonstriert dies anhand eines einfachen Hallo-Welt-Shellskripts, das das folgende Aussehen hat:
#!/bin/sh echo $1 exit 0
In Falle dieses Beispiels befindet es sich in einem Verzeichnis scripts
,
das innerhalb des Eclipse-Projektes auf gleicher Ebene wie das
Quelltextverzeichnis src
liegt. Die Pfadangabe im
ausführenden Programm kann wie hier relativ oder aber auch
absolut erfolgen.
Der Pfad ist im Programm in einer
Klassenvariablen PATH
hardcodiert, könnte aber
natürlich auch als Kommandozeilenparameter übergeben
werden. Er stellt den ersten Parameter bei der Bildung eines ProcessBuilder
-Objektes.
Ein zweiter Parameter speichert das dem Skript zu übergebende
Argument. Bei diesem Konstruktor kann eine variable Anzahl an
Strings übergeben werden, die intern bei der Objektbildung als
Aufruf aneinander gehängt werden. Die Angabe der korrekten
Reihenfolge für den Kommandozeilen-Skriptaufruf muss somit
zwingend beachtet werden. Der erste Parameter ist üblicherweise
der Name des aufzurufenden Skrips. Die Gültigkeit des gesamten
Aufrufs wird jedoch nicht überprüft.
Innerhalb eines try-catch
-Blockes, der Unterbrechungen
während der Skriptbehandlung und Fehler auf Grund einer evtl.
fehlenden Skriptdatei abfängt, wird der ProcessBuilder
gestartet. Das resultierende Objekt vom Typ Process
lässt durch die Methode waitFor()
den Haupt-Thread
so lange warten, bis der untergeordnete Ausführungs-Thread des
Skripts terminiert wurde. Die Methode speichert dann den
Rückgabewert des Shellskripts.
Gleichzeitig kann das Process
-Objekt
einen InputStream
liefern, der seinerseits die Ausgabe
des Skripts abfangen und auslesen kann.
Die Ausgabe findet hier
schließlich über einen BufferedReader
zeilenweise statt.
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ExecuteShellScript {
private static final String PATH = "scripts/halloWelt.sh";
public static void main(String[] args) {
executeScript();
}
public static void executeScript() {
if (!new File(PATH).canExecute()){
System.out.println(PATH + " kann nicht ausgef\u00FChrt werden!");
return;
}
String arg = "Hallo Welt!";
ProcessBuilder builder = new ProcessBuilder(PATH, arg);
Process process = null;
try {
process = builder.start();
int status = process.waitFor();
System.out.println("Exit status: " + status);
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("Programmende");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.