gpt4 book ai didi

java - 一个人不只是简单地进入 ProcessBuilder

转载 作者:行者123 更新时间:2023-11-29 03:13:02 25 4
gpt4 key购买 nike

有谁知道如何将 linux grep 与 java ProcessBuilder 一起使用?为什么这段代码应该返回“sing”却返回空字符串?

import java.io.*;
import java.util.*;

public class Test2 {

public static void main(String[] args) throws InterruptedException,IOException{
String line;

// Initiate grep process.
ProcessBuilder pb = new ProcessBuilder("grep", "\"sing\"", "<<<\"sing\"");
Process p = pb.start();
p.waitFor();

// Get grep output:
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

StringBuilder builder = new StringBuilder();
line = null;
while ( (line = reader.readLine()) != null) {
builder.append(line);
builder.append(System.getProperty("line.separator"));
}
String result = builder.toString();
System.out.println(result);
}
}

我也尝试回显我用这段代码执行的内容:

ProcessBuilder pb = new ProcessBuilder("echo","grep", "\"sing\"", "<<<\"sing\"");

并得到正确的结果:

 grep "sing" <<<"sing"

我终于尝试在 shell 中执行命令并得到:

sing

虽然由于某些原因它是红色字体。那我做错了什么?

最佳答案

what am I doing wrong?

一些很明显的东西。

你期望,比方说,execve() ,了解 shell 结构?没有。

嗯,你不应该期待 ProcessBuilder了解那些。虽然没有execve()那么低级,它足够低,命令的参数是“原始的”。因此,在您的命令中,<<<"sing"作为参数传递给 grep ;这意味着 grep将其视为要读取的文件。

记住这一点:您在 shell 中键入的内容由 shell 解释;一个ProcessBuilder 不会使用 shell 来执行其进程,execve() 也不会.这反过来意味着您不能使用 shell 结构。

如果你想grep你必须 feed your process' input用你想要的文字。但是为什么要用grep当然,Java 何时具有内置正则表达式引擎是另一个问题。

至于:

although it is in red font for some reason

它只是来自 grep 的文字修饰命令(好吧,至少是 GNU grep);请参阅其联机帮助页和 --color选项。简而言之,在您的情况下,它检测到您的 tty 具有更改文本颜色的功能,并使用它来装饰匹配的文本。

尝试并:

echo foobar | grep foo

它会回显foobarfoo红色。

关于java - 一个人不只是简单地进入 ProcessBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28244681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com