【问题标题】:Alternative to java.lang.Runtime.exec() that can execute command lines as a single string?可以将命令行作为单个字符串执行的 java.lang.Runtime.exec() 的替代方案?
【发布时间】:2012-06-01 16:04:27
【问题描述】:

我正在调用java.lang.Runtime.exec(...),但这似乎接受命令行作为数组,我想使用单个字符串。

我怎样才能使用单个字符串做同样的事情?

【问题讨论】:

  • 有一个Runtime.exec(String command)方法,看你的链接。每个使用Runtime.exec(...) 的人都应该阅读:javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
  • @PeterBagyinszki 谢谢!现在唯一的问题是我确实想设置当前目录并仍然将其作为单个命令运行。
  • 也有一种方法:exec(String command, String[] envp, File dir)
  • 这正是我没有做的,Java 抱怨它找不到python。执行的命令行类似于python file ....,envp 是null,显然安装了python (linux) 和PATH

标签: java runtime runtime.exec


【解决方案1】:

来自链接的 Javadocs:

envp - 字符串数组,其中每个元素都有格式为 name=value 的环境变量设置,如果子进程应该继承当前进程的环境,则为 null

所以第二个参数传入null,环境就会被继承。

【讨论】:

    【解决方案2】:

    如果您为第二个参数传递null,则将继承当前环境。

    如果要修改当前环境,可以从System.getEnv() 构建,如下所示:

    private static String[] getEnv() {
        Map<String, String> env = System.getenv();
        String[] envp = new String[env.size()];
        int i = 0;
        for (Map.Entry<String, String> e : env.entrySet()) {
            envp[i++] = e.getKey() + "=" + e.getValue();
        }
        return envp;
    }
    

    更新

    您可以使用 System.out.println(System.getenv("PATH")); 检查您的 Java 路径

    如果路径没问题,那就试试吧

    String[] commands = new String[] { "bash", "-c", "python foo/bar.py" };
    Runtime.getRuntime().exec(commands, null, new File("/workingDir"));
    

    【讨论】:

      【解决方案3】:

      来自文档:

      envp - 字符串数组,其中每个元素的环境变量设置格式为 name=value,如果子进程应该继承当前进程的环境。

      听起来你想为那个参数传递null

      【讨论】:

        【解决方案4】:

        目前没有办法用命令行作为单个字符串调用系统命令并且能够指定当前目录。

        Java API 似乎缺少这个基本功能:)

        解决方法是使用数组版本而不是字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-03
          • 2010-10-05
          • 2018-09-09
          • 1970-01-01
          • 2019-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多