Wie lassen sich in Java-Anwendungen Shellskripts ausführen?v.5.0

Die Klassen ProcessBuilder und Process ermöglichen das Ausführen von Shellskripts aus Java-Anwendungen heraus.

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();
        }
    }
}