当前位置:  开发笔记 > 编程语言 > 正文

如何从Java代码运行Unix shell脚本?

如何解决《如何从Java代码运行Unixshell脚本?》经验,为你挑选了5个好方法。

从Java运行Unix命令非常简单.

Runtime.getRuntime().exec(myCommand);

但是可以从Java代码运行Unix shell脚本吗?如果是,从Java代码中运行shell脚本是一个好习惯吗?



1> Milhous..:

您应该真正关注Process Builder.它真的是为这种东西而建的.

ProcessBuilder pb = new ProcessBuilder("myshellScript.sh", "myArg1", "myArg2");
 Map env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory(new File("myDir"));
 Process p = pb.start();


从JAVA调用脚本是一种好习惯吗?任何性能问题?

2> Jack Leow..:

我想说从Java运行shell脚本不符合Java的精神.Java意味着是跨平台的,运行shell脚本会将其使用限制在UNIX.

话虽如此,绝对可以从Java中运行shell脚本.您使用的是与您列出的完全相同的语法(我自己没有尝试过,但是尝试直接执行shell脚本,如果不起作用,请执行shell本身,将脚本作为命令行参数传递) .


是的,但在许多方面,"Java的精神"或"一次到处运行"的口头禅是一个神话无论如何.
它有什么神话般的神话?
关于它的神话是什么,你通常最终会写出大量的`switch`和`if`语句,以解决在不同平台上不能完全相同的所有细微差别,尽管那些想出的人做出了最大努力java核心库.
@BobbyShaftoe我已经写了16年java,并且总是在windows上开发,我的所有应用程序总是部署在solaris/ibm或oracle风格的unix盒子上,所以我不知道你在说什么
令人惊讶的是!我同意上面的所有评论和答案!
@KalpeshSoni就是这个原因; 你总是有一个固定的目标部署平台; 如果必须同时部署到Windows,Linux,Mac和Solaris,则情况会有所不同.

3> Chris Ballan..:

我想你已回答了自己的问题

Runtime.getRuntime().exec(myShellScript);

至于它是否是一个好习惯......你想用一个你不能用Java做的shell脚本做什么?



4> Not a bug..:

您也可以使用Apache Commons exec库.

示例:

package testShellScript;

import java.io.IOException;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;

public class TestScript {
    int iExitValue;
    String sCommandString;

    public void runScript(String command){
        sCommandString = command;
        CommandLine oCmdLine = CommandLine.parse(sCommandString);
        DefaultExecutor oDefaultExecutor = new DefaultExecutor();
        oDefaultExecutor.setExitValue(0);
        try {
            iExitValue = oDefaultExecutor.execute(oCmdLine);
        } catch (ExecuteException e) {
            System.err.println("Execution failed.");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("permission denied.");
            e.printStackTrace();
        }
    }

    public static void main(String args[]){
        TestScript testScript = new TestScript();
        testScript.runScript("sh /root/Desktop/testScript.sh");
    }
}

为了进一步参考,还给出了Apache Doc的一个例子.



5> Desta Hailes..:

是的,有可能这样做.这对我有用.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.omg.CORBA.portable.InputStream;

public static void readBashScript() {
        try {
            Process proc = Runtime.getRuntime().exec("/home/destino/workspace/JavaProject/listing.sh /"); //Whatever you want to execute
            BufferedReader read = new BufferedReader(new InputStreamReader(
                    proc.getInputStream()));
            try {
                proc.waitFor();
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }
            while (read.ready()) {
                System.out.println(read.readLine());
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有