簡體   English   中英

java Runtime.exec運行shell腳本 - 無法打開文件

[英]java Runtime.exec to run shell script - cannot open file

我正在使用Runtime.getRuntime()。exec()從Java代碼運行Shell腳本。

    String[] cmd = {"sh",  "build.sh", "/Path/to my/sh file"};
    try{
        Process proc = Runtime.getRuntime().exec( cmd );
    }
    catch(Exception e){
        System.out.println("Exception is:"+e);
    }

它在控制台中提供了以下輸出:

sh: Can't open build.sh

我在這里采用錯誤的方法嗎? 無法弄清楚為什么他會發生。

編輯

根據這里的評論,我修改了String[] cmd = {"sh", "build.sh", "/Path/to my/sh file"}; to String[] cmd = {"sh", "/Path/to my/sh file/build.sh", "/Path/to my/sh file"}; 現在問題是這個腳本需要從特定路徑執行。 當我從命令提示符處執行此腳本時,我首先將目錄更改為該路徑並執行它。 我應該如何修改此代碼?

使用ProcessBuilder並將流程的工作目錄設置為腳本實際所在的目錄:

final ProcessBuilder pb = new ProcessBuilder("/bin/sh", "script.sh", "whatever",
    "arguments", "go", "here");
pb.directory(new File("/path/to/directory"));
// redirect stdout, stderr, etc
final Process p = pb.start();

請參閱ProcessBuilder javadoc 它包含了您可以執行的操作的示例。 Runtime.exec()已通過:p

sh無法找到build.sh腳本。 要解決此問題,您可以提供build.sh的完整路徑。

嘗試這個:

 String[] cmd = {"sh build.sh", "/Path/to my/shfile"};

最好使用ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("sh build.sh", "/Path/to my/shfile"); 

問題是“sh”命令無法將相對路徑"build.sh"解析為絕對路徑。 最可能的解釋是,當您啟動命令時, "build.sh"不在當前目錄中。

假設"/Path/to my/sh file"字符串是"build.sh"文件的路徑,您需要像這樣運行它:

String[] cmd = {"/bin/sh",  "/Path/to my/sh file/build.sh"};
try {
    Process proc = Runtime.getRuntime().exec(cmd);
    ...

(....或使用ProcessBuilder的等價物)

另一方面,如果應該將"/Path/to my/sh file"字符串作為"build.sh"腳本的參數 ,則需要像這樣運行它:

String[] cmd = {"/bin/sh", "/some/dir/build.sh", "/Path/to my/sh file"};
try {
    Process proc = Runtime.getRuntime().exec(cmd);

@fge的答案提供了另一種方法。 他正在為子進程啟動之前設置當前目錄。 這是您更新的問題的正確解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM