0

当我在命令行上执行以下命令时,它会显示 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\'"});

但没有成功。

4

1 回答 1

1

想到几件事:

  • 不完整的 PATH 环境变量(因此isql无法找到)。
  • 如果它是您提供的命令,而不是弄乱 PATH 您可能希望确保您在正确的工作目录中并./isql改为调用。
  • 由于您使用的是管道,因此您应该让 shell 像在sh -c "foo | bar". 否则,该| isql ...部分也作为参数传递给printf
于 2013-08-06T13:12:46.170 回答