Java からシェルを実行

昔、Process を作成して動かすものを、yipuran-core に載せてあるが、近々、削除して
書き直そうと思っている。
以下のように、標準出力も標準エラー出力も区別なく結果として取得した方が
良いのではないかと。。。

public class ScriptExecutor{
    private Map<String, String> envMap;
    public ScriptExecutor(){}

    public ScriptExecutor(Map<String, String> envMap){
        this.envMap = envMap;
    }

    public void setEnvMap(Map<String, String> envMap){
        this.envMap = envMap;
    }
    
    public int run(String command, Consumer<String> consumer, BiConsumer<String, Throwable> error){
        int rtn = 0;
        String str = null;
        try{
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.redirectErrorStream(true);
            if (envMap != null && envMap.size() > 0) {
                Map<String, String> environments = builder.environment();
                envMap.entrySet().stream().forEach(e->environments.put(e.getKey(), e.getValue()));
            }
            Process p = builder.start();
            try(BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))){
                while((str = br.readLine()) != null) {
                    consumer.accept(str);
                }
            }
            p.waitFor();
            rtn = p.exitValue();
        }catch(Exception ex){
            String stderr;
            rtn = 1;
            StringBuilder sb = new StringBuilder();
            sb.append(ex.getMessage());
            sb.append("\n");
            sb.append(Arrays.stream(ex.getStackTrace()).map(t->t.toString()).collect(Collectors.joining("\n\t")));
            Optional.ofNullable(ex.getCause()).ifPresent(x->{
                sb.append("\n");
                sb.append("Caused by: ");
                sb.append(x.getMessage());
                sb.append("\n");
                sb.append(Arrays.stream(x.getStackTrace()).map(t->t.toString()).collect(Collectors.joining("\n\t")));
            });
            stderr = sb.toString();
            error.accept(stderr + ex.getMessage(), ex);
        }
        return rtn;
    }
}