【问题标题】:Run Shell Commands using Java provides problems使用 Java 运行 Shell 命令会出现问题
【发布时间】:2015-01-08 12:08:23
【问题描述】:
public class RunBashCommand {

    public synchronized boolean RunInBash(String command)   {

        System.out.println("CMD: "+command);

        /*String s; not working this code also
        Process p;
        try {
            Process p = Runtime.getRuntime().exec(command);
            BufferedReader br = new BufferedReader(
                new InputStreamReader(p.getInputStream()));
            while ((s = br.readLine()) != null)
                System.out.println("line: " + s);
            p.waitFor();
            System.out.println ("exit: " + p.exitValue());
            PrintBufferReader(getError(p));
            p.destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }*/

        try {
            Process p = new ProcessBuilder("/bin/sh", command).start();
            /*Process p = new ProcessBuilder("/bin/bash", command).start();*/
            PrintBufferReader(getError(p));
            /*p.destroy();*/
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

    private static BufferedReader getOutput(Process p) {
        return new BufferedReader(new InputStreamReader(p.getInputStream()));
    }

    private static BufferedReader getError(Process p) {
        return new BufferedReader(new InputStreamReader(p.getErrorStream()));
    }

    private void PrintBufferReader(BufferedReader br) throws IOException    {
        int value = 0;
        String s = "";
        while((value = br.read()) != -1)
        {
           char c = (char)value;
           s = s+c;
        }
        System.out.println("EEEE: "+s);
    }   
}

我试过这段代码,但它不起作用。 以下输出来了:

CMD: cd /home/jeevan/workspace/apb_proj/; source init.csh
EEEE: /bin/sh: cd /home/jeevan/workspace/apb_proj/; source init.csh: No such file or directory

CMD: cd /home/jeevan/workspace/apb_proj/verif/compile/; make clean; make compile; make elab
EEEE: /bin/sh: cd /home/jeevan/workspace/apb_proj/verif/compile/; make clean; make compile; make elab: No such file or directory

CMD: sh /home/jeevan/workspace/apb_proj/verif/test_lib/src/apb_test31/runme.csh
EEEE: /bin/sh: sh /home/jeevan/workspace/apb_proj/verif/test_lib/src/apb_test31/runme.csh: No such file or directory

有人可以帮忙吗?

【问题讨论】:

  • 不要将你的命令作为参数传递给/bin/sh(尤其是csh); new ProcessBuilder(command)

标签: java linux eclipse bash shell


【解决方案1】:

你正在有效地运行:

/bin/sh "cd /home/jeevan/workspace/apb_proj/; source init.csh"

当您以这种方式运行 /bin/sh 时,它会将其第一个参数视为要作为 shell 脚本执行的文件的名称。当然,没有名为“cd /home/jeevan/workspace/apb_proj/; source init.csh”的文件,因此您会收到错误消息。

使用命令作为参数调用sh的正确方法是这样的:

/bin/sh -c "cd /home/jeevan/workspace/apb_proj/; source init.csh"

使用流程构建器,您可以:

Process p = new ProcessBuilder("/bin/sh", "-c", command).start();

您可能遇到的下一个问题是,您尝试调用的命令似乎是csh 命令,而不是sh 命令。 “source”是一个 csh 命令,您尝试获取的文件称为“init.csh”。所以也许你想调用 csh 而不是 sh:

Process p = new ProcessBuilder("/bin/csh", "-c", command).start();

【讨论】:

    【解决方案2】:

    您需要将命令参数拆分为单独的参数:不是ProcessBuilder("bin/sh", "cd foo/bar"),而是ProcessBuilder("bin/sh", "cd", "foo/bar")

    您也不能使用 shell 元字符(如“;”)。要运行多个命令,您必须启动多个进程。

    【讨论】:

      【解决方案3】:

      将所有命令放入List 并将其作为参数传递给ProcessBuilder。作为替代方案,您可以启动 shell 进程,获取它的 OutputStream 并将命令写入此流以执行它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 2020-12-12
        • 1970-01-01
        • 2023-03-14
        • 2020-10-01
        • 1970-01-01
        • 2012-05-05
        相关资源
        最近更新 更多