[英]How to Execute Core Show channels Command in java and also grep Channels in it
我想从大家那里得到帮助。我正在使用Java,我想执行一个用于获取星号中的频道详细信息的命令。 该系统基于linux。 我想同时执行命令“核心显示频道”
以下是在控制台正常启动时的命令和输出。
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");
}
}
但这并没有向我显示正确的输出,请帮助我解决此问题
您在命令参数和管道之间混为一谈。 当您说cmda | cmdb
cmda | cmdb
它本质上意味着运行cmda
并将其输出作为cmdb
的输入传递,而您的代码将字符串“ | cmdb”作为cmda的参数cmda
有几种方法可以修复代码,但是我认为最直接的方法是取消最后一个grep参数:
String[] commands = new String[]{"asterisk","-rx","core show channels"};
然后,当您循环结果时,只需使用String类中的contains()
方法检查其是否包含字符串通道
while((line = br.readLine()) != null) {
if(line.contains("channels") System.out.println(line);
}
尝试改变
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'"};
原因:
如果我们调用外壳程序命令(/ bin / sh)并将整个命令作为其参数,则竖线将被解释为“ \\ |”(即字面意义为“ |”,而不是管道”),竖线将为正确解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.