Executing shell-script with parameters from java

前端 未结 3 848
一生所求
一生所求 2021-02-14 07:48

I have been googling for some time, and everyone seems to have a different solution, none of which appear to be working for me.

I have tried both ProcessBuilder

相关标签:
3条回答
  • 2021-02-14 08:09

    In general, I would recommend that you use the ScriptEngine instead of System.getRuntime().exec
    I think it will make things more easy for you.
    Bare in mind you need for this JDK 6 and above.
    In addition, regarding your specific problem - I really think that this issue should be configurable.
    You can do the following:
    A. Have in your .bash_rc or .bash_profile (for each user) define a path to the configuration
    script using:
    EXPORT MY_SCRIPT=


    B. Read this value from java code, using
    String sciprtPath = System.getenv("MY_SCRIPT") to get the value.
    C. Run the script , the way you did in your code, with scriptPath variable, or using the scriptEngine.

    0 讨论(0)
  • 2021-02-14 08:13

    One option is to handle ~ yourself:

    String homeDir = System.getenv("HOME");
    String[] cmd = { homeDir + "/path/to/shellscript.sh", "foo", "bar" };
    Process p = Runtime.getRuntime().exec(cmd);
    

    Another is to let Bash handle it for you:

    String[] cmd = { "bash", "-c", "~/path/to/shellscript.sh foo bar" };
    Process p = Runtime.getRuntime().exec(cmd);
    
    0 讨论(0)
  • 2021-02-14 08:22

    As already mentioned, tilde is a shell-specific expansion which should be handled manually by replacing it with the home directory of the current user (e.g with $HOME if defined).

    Besides the solutions already given, you might also consider using commons-io and commons-exec from the Apache Commons project:

    ...
    import org.apache.commons.exec.CommandLine;
    import org.apache.commons.exec.DefaultExecutor;
    import org.apache.commons.exec.Executor;
    import org.apache.commons.io.FileUtils;
    ...
    CommandLine cmd = new CommandLine("path/to/shellscript.sh");
    cmd.addArgument("foo");
    cmd.addArgument("bar");
    
    Executor exec = new DefaultExecutor();
    exec.setWorkingDirectory(FileUtils.getUserDirectory());
    exec.execute(cmd);
    ...
    
    0 讨论(0)
提交回复
热议问题