Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从外部目录运行Shell脚本:没有这样的文件或目录_Java_Bash_Shell - Fatal编程技术网

Java 从外部目录运行Shell脚本:没有这样的文件或目录

Java 从外部目录运行Shell脚本:没有这样的文件或目录,java,bash,shell,Java,Bash,Shell,我有一个shell脚本文件,我想从java运行。我的java工作空间目录与脚本的目录不同 private final String scriptPath = "/home/kemallin/Desktop/"; public void cleanCSVScript() { String script = "clean.sh"; try { Process awk = new ProcessBuilder(scriptPath + script).start()

我有一个shell脚本文件,我想从java运行。我的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.io.IOException:无法运行程序“cat/home/kemallin/Desktop/capture-03.csv | awk-F”,“打印$1”,“打印$2”,“打印$3”,“打印$4”,“打印$6}'>clean.csv”:错误=2,没有这样的文件或目录
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
位于ShellScript.cleanCSVScript(ShellScript.java:21)
Main.Main(Main.java:15)
原因:java.io.IOException:error=2,没有这样的文件或目录
位于java.lang.UNIXProcess.forkAndExec(本机方法)
位于java.lang.UNIXProcess(UNIXProcess.java:186)
在java.lang.ProcessImpl.start(ProcessImpl.java:130)
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
... 还有两个
java.io.FileNotFoundException:/home/kemallin/Desktop/clean.csv(无此类文件或目录)
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(FileInputStream.java:146)
位于java.io.FileInputStream。(FileInputStream.java:101)
位于java.io.FileReader。(FileReader.java:58)
运行(CSVReader.java:25)
Main.Main(Main.java:17)
我已经在谷歌上搜索过了,每一个解决方案都表明我在做正确的事情

我曾尝试将脚本文件放在Java项目的src和bin中,但它仍然表示没有这样的文件或dir

我做错了什么


谢谢。

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

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


您应该执行
chmod 755/home/kemallin/Desktop/clean.sh
,并确保java进程在相同的用户ID下运行,java试图将整个命令行作为单个命令运行。字符串
cat/home/…
不是一个程序,
cat
是,其余的是cat的一个参数。Marc B可能是对的,而且我不是java爱好者,所以我可能要做的是检查
/home/kemallin/Desktop/capture-03.csv
/home/kemallin/Desktop/clean.sh
的权限。确保运行java程序的用户有权访问这些文件(如果您只想放弃权限问题,则为a+rwx…如果是,则可以从那里开始工作)。我认为您的错误输出与显示的java代码不匹配。在Java代码中,要运行的命令应该是“/home/kemallin/Desktop/clean.sh”,但在显示的错误输出中会出现“cat/home/kemallin/Desktop/capture-03.csv”和“/home/kemallin/Desktop/clean.csv”:(@MarcB那么你有什么建议?我应该分解shell脚本?@jim clean.sh有755,运行java程序的用户拥有clean.sh,所以访问应该不是问题,对吗?它仍然说“没有这样的文件或目录”。这解决了部分问题。谢谢。我相应地更新了问题。我的错误完全解决了问题。
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();
    }
}