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

北战南征 提交于 2019-11-28 02:03:50

问题


I am using Runtime.getRuntime().exec() to run a shell script from java code.

    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);
    }

It gives me the following output in console:

sh: Can't open build.sh

Am I following some wrong approach here? Cannot make out why his happens.

EDIT

Based on the comment here, I have modified the 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"}; . Now the problem is this script need to be executed from a particular path. When I execute this script from command prompt, I first change the directory to that path and execute it. How should I modify this code?


回答1:


Use a ProcessBuilder and set the working directory of the process to the directory where your script actually is:

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();

See the ProcessBuilder javadoc. It contains an example of what you can do. Runtime.exec() is passé :p




回答2:


sh is unable to find the build.sh script. To fix this you can provide the full path to build.sh.




回答3:


The problem is that the "sh" command is unable to resolving the relative path "build.sh" to an absolute path. The most likely explanation is that "build.sh" is not in the current directory when you launch the command.

Assuming that "/Path/to my/sh file" string is the path to the "build.sh" file, you need to run it like this:

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

(.... or the equivalent using ProcessBuilder)

On the other hand, if the "/Path/to my/sh file" string is supposed to be an argument to the "build.sh" script, then you need to run it like this:

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

@fge's answer gives an alternative approach. He is setting the current directory for the child process before it is launched. That is the correct solution for your updated Question.




回答4:


Try this:

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

and better to use ProcessBuilder

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


来源:https://stackoverflow.com/questions/17142573/java-runtime-exec-to-run-shell-script-cannot-open-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!