Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux上的Java运行命令管道_Java_Linux_Command_Pipe - Fatal编程技术网

linux上的Java运行命令管道

linux上的Java运行命令管道,java,linux,command,pipe,Java,Linux,Command,Pipe,我正在尝试在linux环境中获得管道命令的输出,但到目前为止运气不佳 ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "top", "-b", "-n", "2", "-d", "0.2", "-p", pid + "", "

我正在尝试在linux环境中获得管道命令的输出,但到目前为止运气不佳

ProcessBuilder pb = new ProcessBuilder("/bin/sh",  "-c", "top", "-b", "-n", "2", "-d", "0.2", "-p", pid + "", "|",  "tail",  "-1", "|", "awk", "'{print $6}'");
pb.redirectErrorStream(true);
Process p = pb.start();
p.getOutputStream().close();
try (InputStream is = p.getInputStream()) {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
        String line = br.readLine();
        System.out.println(line);
    }
}
此输出:top:tty get失败


当我尝试在不指定脚本执行器/bin/bash-c:top:unknown选项“|”的情况下执行时,

shell命令应该是在-c之后传递的单个参数。被调用的shell将负责管道和标记化:

ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c",
     "top -b -n 2 -d 0.2 -p " + pid + " | tail -1 | awk '{print $6}'");
为了获得健壮性的好处,可以将变量作为单独的参数传递,而不是像在SQL中使用准备好的语句那样将它们注入字符串:

ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c",
     "top -b -n 2 -d 0.2 -p \"$1\" | tail -1 | awk '{print $6}'", "_", String.valueOf(pid));

当pid是整数时没有区别,但如果它是任意字符串,这将提高安全性和健壮性。

没有使用process builder,因此我无法说明所有这些标志都在做什么。但这是一些复杂的事情。我很有信心tty get失败的错误是因为您试图以非交互式方式运行交互式程序top。Top想要抓住tty,这样它就可以绘制整个屏幕。你正在以一种它无法绘制屏幕的方式运行它。希望有帮助。