2014-09-03 203 views
4

我有一个shell脚本文件,我想从java运行。我的java工作空间目录不同于脚本的目录。从外部目录运行Shell脚本:没有这样的文件或目录

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) 

我用Google搜索它,每一个解决方案几乎表明,我做了正确的事情。

我试图把脚本文件放在src和Java项目的bin中,但它仍然说没有这样的文件或目录。

我到底做错了什么?

谢谢。

+1

Java的尝试运行整个命令行下运行一个命令。字符串“cat/home/...”不是程序,“猫”是,而其余的是猫的参数。 – 2014-09-03 15:19:41

+1

Marc B可能是对的,我不是一个java人,所以我可能会做的是检查'/ home/kemallin/Desktop/capture-03.csv'和'/ home/kemallin/Desktop/clean.sh'。确保运行java程序的用户可以访问这些文件(a + rwx,如果你只是想放弃权限问题......如果是,那么你可以从那里工作) – 2014-09-03 15:27:59

+0

我认为你的错误输出不符合显示的java代码。在Java代码中,运行的命令应该是“/home/kemallin/Desktop/clean.sh”,但在错误输出中显示“cat /home/kemallin/Desktop/capture-03.csv | awk ...”和“/home/kemallin/Desktop/clean.csv”:( – Jdamian 2014-09-03 15:42:15

回答

11

程序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(); 
    } 
} 
+0

修复了一些问题的部分。谢谢我相应地更新了这个问题。 – ickarsim 2014-09-04 08:17:13

+0

我的错误完全解决了它。 – ickarsim 2014-09-04 08:37:33

1

你应该做一个chmod 755 /home/kemallin/Desktop/clean.sh,确保java程序是一样的用户ID

+0

它仍然说“没有这样的文件或目录”。 – ickarsim 2014-09-04 08:16:16

相关问题