java运行时命令行进程的格式不正确

pdsfdshx  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(381)

跑步时 man 对于几乎所有返回终端命令手册的命令,运行时执行似乎只返回word中的几个字母
预期

OPTIONS
       Note  that,  in  order  to  support obsolescent hardware, unzip's usage
       screen is limited to 22 or 23 lines and should therefore be  considered
       only  a  reminder  of  the basic unzip syntax rather than an exhaustive
       list of all possible flags.  The exhaustive list follows:

java运行时执行返回的输出

OOPPTTIIOONNSS
       Note  that,  in  order  to  support obsolescent hardware, _u_n_z_i_p's usage
       screen is limited to 22 or 23 lines and should therefore be  considered
       only  a  reminder  of  the basic _u_n_z_i_p syntax rather than an exhaustive
       list of all possible flags.  The exhaustive list follows:

下面是我从运行命令中获取op的代码

String[] cmd = {"man unzip"};
            Process process = Runtime.getRuntime().exec(cmd);
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while (true) {
                line = in.readLine();
                if (line == null) { break; 

            }System.out.println(line);

                }
zed5wv10

zed5wv101#

runtime.exec已过时。改用processbuilder。
手册页可以包含复杂的标记,包括强调的文本。手册页是使用nroff解释器输出的,这意味着强调的文本会被呈现为发送到旧打印机:一个 A 后跟一个退格字符,后跟另一个 A 实际上是双重打击 A ,终端足够聪明,可以呈现为粗体字符。同样地, _ 后跟退格字符,后跟 A 结果在终端中出现带下划线的字符,就像在旧打印机上一样。
最简单的解决方案是将 man 通过猫。nroff解释器将看到输出目的地是另一个进程,而不是终端,并且根本不会尝试呈现粗体或带下划线的文本:

ProcessBuilder man = new ProcessBuilder("man", "unzip");
ProcessBuilder cat = new ProcessBuilder("cat");

man.redirectError(ProcessBuilder.Redirect.INHERIT);
cat.redirectOutput(ProcessBuilder.Redirect.INHERIT);
cat.redirectError(ProcessBuilder.Redirect.INHERIT);

Iterable<Process> processes =
    ProcessBuilder.startPipeline(List.of(man, cat));

for (Process process : processes) {
    process.waitFor();
}

注意使用 redirectOutput 以及 redirectError . 当给定inherit参数时,这些方法分别导致由processbuilder创建的任何进程的标准输出和标准错误出现在程序自己的标准输出或标准错误中。这样就不需要显式地读取输出并打印它。
在java 8中,processbuilder.startpipeline和list.of不可用。与java 8兼容的实现方法是使用shell作为管道:

ProcessBuilder builder = new ProcessBuilder("sh", "-c", "man unzip | cat");
builder.inheritIO();

Process process = build.start();
process.waitFor();

在本例中,inheritio()执行与 redirectOutput(INHERIT) 以及 redirectError(INHERIT) 合并:外部进程的标准输出和标准错误出现在java进程自己的标准输出和标准错误中,因此不需要显式地读取和打印输出。

相关问题