java - 从外部目录运行 Shell 脚本 : No such file or directory

标签 java bash shell

我有一个要从 java 运行的 shell 脚本文件。我的 java 工作空间目录与脚本的目录不同。

private final String scriptPath = "/home/kemallin/Desktop/";

public void cleanCSVScript() {

    String script = "clean.sh";
    try {
        Process awk = new ProcessBuilder(scriptPath + script).start();
        awk.waitFor();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

我得到这个错误:

java.io.IOException: Cannot run program "cat /home/kemallin/Desktop/capture-03.csv | awk -F ',' '{ print $1,",", $2,",", $3,",", $4,",", $6}' > clean.csv": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
at ShellScript.cleanCSVScript(ShellScript.java:21)
at Main.main(Main.java:15)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
... 2 more
java.io.FileNotFoundException: /home/kemallin/Desktop/clean.csv (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at java.io.FileReader.<init>(FileReader.java:58)
at CSVReader.run(CSVReader.java:25)
at Main.main(Main.java:17)

我用谷歌搜索了一下,每个解决方案几乎都表明我在做正确的事。

我已经尝试将脚本文件放入 Java 项目的 src 和 bin 中,但它仍然说没有这样的文件或目录。

我做错了什么?

谢谢。

最佳答案

您的程序 clean.sh 不是 Java 所理解的可执行文件,即使底层系统将其理解为可执行文件也是如此。

您需要告诉 Java 需要什么 shell 来执行您的命令。执行(假设您正在使用 bash 并且它安装在 /bin/bash):

private final String scriptPath = "/home/kemallin/Desktop/";

public void cleanCSVScript() {

    String script = "clean.sh";
    try {
        Process awk = new ProcessBuilder("/bin/bash", scriptPath + script).start();
        awk.waitFor();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

关于java - 从外部目录运行 Shell 脚本 : No such file or directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25647806/

相关文章:

java - Hadoop二进制文件输入错误

java - 将父类(super class)的属性传递给子类

linux - 如何解析 netstat 命令以便从中获取进程名称和 PID?

ruby - 如何从(Ruby)脚本交互式运行 mount 命令?

bash - 压缩错误 - 无事可做

java - 打开枚举时 Maven 编译失败

bash - 将 Unix 时间戳转换为日期字符串

linux - bash 记录器 : Cannot find a way to add MaxBackupIndex to this logger implementation

shell - unix 文件测试运算符,使用 grep 进行其他测试

java - 如何在 Neoload 中使用自动增量过程?