#はじめに
JavaにおいてProcessbuilderだとかRuntimeでプロセスを作ってあげると、Linux上の挙動とは必ずしも同一でない振る舞いをすることがあります。
一時的に「bashスクリプト(シェルスクリプト)」をつくってあげて、それを実行してあげると、望み通りの挙動になるかもしれません。
#コード
public void executeCommands() throws IOException {
//一時ファイル作成
File tempScript = createTempScript();
try {
//スクリプト実行
ProcessBuilder pb = new ProcessBuilder("bash", tempScript.toString());
//エラー出力
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
System.out.println(buffer.lines().collect(Collectors.joining("\n")));
}
//標準出力
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
System.out.println(buffer.lines().collect(Collectors.joining("\n")));
}
Process process = pb.start();
process.waitFor();
} finally {
//一時ファイル削除
tempScript.delete();
}
}
public File createTempScript() throws IOException {
//一時ファイル作成
File tempScript = File.createTempFile("script", null);
Writer streamWriter = new OutputStreamWriter(new FileOutputStream(
tempScript));
PrintWriter printWriter = new PrintWriter(streamWriter);
//スクリプトを書いていく。
printWriter.println("#!/bin/bash");
printWriter.println("cd bin");
printWriter.println("ls");
//書き込み終了
printWriter.close();
return tempScript;
}
#参考(これのパクリ)
https://stackoverflow.com/questions/26830617/running-bash-commands-in-java