2014-09-03 208 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

相關問題