Java:Runtime.getRuntime()。exec(cmd)错误与某些命令,但与其他命令一起使用

时间:2014-12-13 13:45:06

标签: java

这是我的代码:

public static void main(String[] args) throws Exception {
    String[] cmd = {"which", "hive"};

    Process proc = Runtime.getRuntime().exec(cmd);

    BufferedReader reader = new BufferedReader(
        new InputStreamReader( proc.getInputStream() ) );

    String line = "";
    while((line = reader.readLine()) != null) {
        System.out.print(line + "\n");
    }

    proc.waitFor();   
}

在我的终端:

which hive:/home/as/hive/bin/hive
which gcc:/usr/bin/gcc

但是当我运行这个java代码时:

which hive:no result
which gcc:/usr/bin/gcc

我已将$HIVE_HOME添加到~/.bashrc(我使用Ubuntu 14.04 64位和Java 8),那么我现在应该怎么做?

2 个答案:

答案 0 :(得分:1)

命令which查找环境变量PATH中指定的所有目录。在Linux上,目录由冒号(:)分隔,在Windows上由分号(;)分隔。

您可以通过

检查PATH传递给which的内容
System.out.println(System.getenv("PATH"));

您可以将另一条路径传递给Runtime.exec

String[] env = { "PATH=/home/as/hive/bin" };
Process proc = Runtime.getRuntime().exec(cmd, env);

如果您这样做,which会找到hive命令(但除非您gcc添加/usr/bin,否则它将不会再找到PATH },如PATH=/home/as/hive/bin:/usr/bin

答案 1 :(得分:0)

在我的终端中:
as @ ubuntu:〜$ echo $ PATH;
在/ usr / local / sbin中:在/ usr / local / bin目录:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中:在/ usr /游戏:在/ usr /本地/游戏:/首页/中的/ bin:/家用/为/ jdk1.8.0_25 / bin中:/家庭/为/ Hadoop的/ bin中:/家庭/为/ Hadoop的/ sbin目录:/家庭/中的/ bin:/home/as/jdk1.8.0_25/bin:/家/as/sqoop-1.4.5.bin__hadoop-2.0.4-alpha/bin:/home/as/hbase/bin:/home/as/hive/bin
但在java中:
的System.out.println(System.getenv()获得( “PATH”));

  
    
      

结果:
      在/ usr / local / sbin中:在/ usr / local / bin目录:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中:在/ usr /游戏:在/ usr /本地/游戏:/首页/中的/ bin:/家用/为/ jdk1.8.0_25 / bin中
      所以这是我的帐户的$ PATH和root的$ PATH?       那怎么解决呢?