无法通过使用Java执行Shell脚本来创建文件夹

时间:2019-12-26 09:04:37

标签: java shell processbuilder

我试图使用Java代码执行Shell脚本。下面是示例代码来演示此问题:

ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("/home/otaku/Programming/data/test1.sh");
try {

    Process process = processBuilder.start();
    StringBuilder output = new StringBuilder();
    BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream()));

    String line;
    while ((line = reader.readLine()) != null) {
        output.append(line + "\n");
    }

    int exitVal = process.waitFor();
    if (exitVal == 0) {
        System.out.println(output);
    } else {
        System.out.println("Script exited abnormally");
    }

} catch (IOException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

我要执行的外壳脚本文件 test1.sh

#!/bin/bash
mkdir -p -- teeh
echo 'Succesfully executed script'

我收到回显消息,并且能够在Java控制台中打印,指示成功执行了Shell脚本。但是即使执行命令 mkdir -p-teeh ,也不会创建目录。如果我使用终端手动执行脚本文件,它将像超级按钮一样工作。我想知道背后的原因以及可能的解决方案。

1 个答案:

答案 0 :(得分:2)

mkdir -p -- teeh

在此命令中,teeh路径是相对路径,而不是绝对路径:它将在脚本的当前工作目录中创建。

默认情况下,您的bash脚本是使用JVM的工作目录执行的,这取决于您从何处执行Java应用程序。如果您要从IDE中执行代码,则默认情况下,这将是项目的根目录。

无论如何,除非您从/home/otaku/Programming/data/teeh目录运行Java应用程序,否则您不应期望当前代码创建一个/home/otaku/Programming/data/目录。

有许多可能的解决方案,其相关性取决于您的上下文:

  • /home/otaku/Programming/data/目录执行Java代码
  • bash脚本中使用绝对路径
  • 在您的cd脚本中使用bash
  • 使用ProcessBuilder.directory(File dir)在适当的工作目录下执行bash脚本
相关问题