0

我需要大家的帮助。我正在使用 java,我想执行一个命令,该命令用于获取星号中的频道详细信息。该系统是基于linux的。我想同时执行命令“core show channels”也想 grep channels

以下是在控制台中正常触发时的命令和输出。

   asterisk -vvvvvrx 'core show channels' | grep channels

并且输出是 2 个活动通道

我正在尝试在java中使用以下代码

import java.io.IOException;
import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ProcessBuilderExample
{
  public static void main(String[] args) 
  throws IOException, InterruptedException
  {
  String[] commands = new String[]{"asterisk","-rx","core show channels","| grep 'channels'"};
 Process p = Runtime.getRuntime().exec(commands);
    p.waitFor();
   BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
   String line = "";
while((line = br.readLine()) != null) {
      System.out.println(line);
}
    System.out.println("hello");
  }
}

但它没有向我显示正确的输出请帮助我解决这个问题

4

2 回答 2

0

您在命令参数和管道之间混淆了。当您说它cmda | cmdb本质上意味着运行cmda并将其输出作为输入传递时cmdb,您的代码将字符串“| cmdb”作为参数传递cmda

有几种方法可以修复代码,但我认为最直接的方法是去掉最后一个 grep 参数:

String[] commands = new String[]{"asterisk","-rx","core show channels"};

然后当你循环结果时,只需使用contains()String 类中的方法来检查它是否包含字符串通道

while((line = br.readLine()) != null) {
  if(line.contains("channels")  System.out.println(line);
}
于 2013-02-04T06:11:09.973 回答
0

尝试改变

String[] commands = new String[]{"asterisk","-rx","core show channels","| grep 'channels'"};

到:

String[] commands = new String[]{"/bin/sh", "-c", "asterisk -rx 'core show channels' | grep 'channels'"};

原因:

您的竖线将被解释为“\|”(即字面意思是“|”而不是管道“),如果我们改为调用 shell 命令(/bin/sh)并将整个命令作为其参数,竖线将是正确解释。

于 2013-02-04T06:18:41.147 回答