shell命令执行从Java执行时失败

时间:2013-08-06 13:06:44

标签: java command-line sybase

当我在命令行上执行以下命令时,它会显示sybase DB中的所有存储过程和表。

printf 'sp_help\ngo\n' | isql -Uxx -Pxxxx -Dxxxxx

但是当我在java中做同样的事情时。这不会返回任何结果。 谁能告诉我下面的代码有什么问题:

public class test
{
  public static void main(String[] args)
  {
   String cmd = "printf "+"\'sp_help\ngo\n\'"+"| isql -Uxx -Pxxxx -Dxxxxx" ;
   try{ 
          Process p;
          p = Runtime.getRuntime().exec(cmd);
          p.waitFor();
          String line; 
          BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

           while ((line = reader.readLine())!=null){
           System.out.println("Row is :" + line);
   } catch(Exception e)
       {
           System.out.println("Exception Caught : " + e);
       }

  }

}

修改 我按照Darkdust的建议执行了它,但它仍然没有用。

try{
          Process p;
          p = Runtime.getRuntime().exec("sh -c \'printf \"sp_help\ngo\n\" | isql -Uxx -Pxxxxx -Dxxxxxx\'");
          p.waitFor();
          String line;
          BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

           while ((line = reader.readLine())!=null){
           System.out.println("Row is :" + line);
  }
 }
       catch(Exception e)
       {
           System.out.println("Exception Caught : " + e);
       }

但命令:

sh -c 'printf "sp_help\ngo\n" | isql -Usa -Psybase11 -Dcnadb'

在命令行上运行。

我也尝试过:

p = Runtime.getRuntime().exec(new String[]{"sh","-c","\'printf \"sp_help\ngo\n\"","|isql -Uxx -Pxxxxx -Dxxxxx\'"});

但没有成功。

1 个答案:

答案 0 :(得分:1)

有些事情会浮现在脑海中:

  • 不完整的PATH环境变量(因此无法找到isql)。
  • 如果这是您提供的命令,而不是弄乱PATH,您可能需要确保您在正确的工作目录中并转而致电./isql
  • 由于您正在使用管道,因此您应该让shell执行此操作,如sh -c "foo | bar"中所示。否则,| isql ...部分也会作为参数传递给printf