【问题标题】:Unable to create a folder by executing a shell script using java无法通过使用 java 执行 shell 脚本来创建文件夹
【发布时间】:2025-11-22 03:30:04
【问题描述】:

我试图使用 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();
}

我正在尝试执行的 shell 脚本文件 test1.sh

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

我收到回显消息,并且能够在 java 控制台中打印,表明 shell 脚本已成功执行。但是即使执行了命令 mkdir -p -- teeh 也没有创​​建目录。如果我使用终端手动执行脚本文件,它就像一个魅力。我想知道这背后的原因以及可能的解决方案。

【问题讨论】:

  • 获取回显消息并不能保证 mkdir 命令有效。它只是表明你的脚本被调用并运行了。我严重怀疑有写作许可。您应该了解正在执行 java / sh 并为他提供写权限的技术用户。
  • 您可能还想将pwd 添加到您的shell 脚本或添加System.out.println(System.getProperty("user.dir")); 到您的Java 类,以确保您实际上正在查看正确的位置。例如,如果您不从该位置调用 java 脚本,则不应期望在 /home/otaku/Programming/data/ 内创建 teeh 目录。
  • @Aaron 感谢您通知位置更改,因为 Java 代码正在用于执行脚本,因此这取决于我的项目文件夹所在的位置。如果你能写一个答案,那么我可以把它标记为答案。
  • @MehdiLAMRANI 我已经确定这不是写权限的问题。

标签: java shell processbuilder


【解决方案1】:
mkdir -p -- teeh

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

bash 脚本默认使用 JVM 的工作目录执行,这取决于您执行 java 应用程序的位置。如果您从 IDE 执行代码,默认情况下这将是项目的根目录。如果您从命令行执行,它将是您执行java 命令的目录。

在任何情况下,除非您从 /home/otaku/Programming/data/ 目录运行 java 应用程序,否则您不应期望当前代码会创建 /home/otaku/Programming/data/teeh 目录。

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

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

【讨论】:

    最近更新 更多