Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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
Java 一个人不能简单地进入ProcessBuilder_Java_Shell_Grep_Processbuilder_Herestring - Fatal编程技术网

Java 一个人不能简单地进入ProcessBuilder

Java 一个人不能简单地进入ProcessBuilder,java,shell,grep,processbuilder,herestring,Java,Shell,Grep,Processbuilder,Herestring,有人知道如何在java ProcessBuilder中使用linux grep吗?为什么这段代码在应该返回“sing”时返回空字符串 尽管出于某种原因它是红色字体。那么我做错了什么 我做错了什么 非常明显的事情 比如说,execve(),您希望了解shell构造吗?没有 当然,您也不应该期望ProcessBuilder理解这些。虽然它没有execve()那么低,但它的级别足够低,以至于命令的参数是“原始”的。因此,在命令中,实际上可以使用ProcessBuilder运行相同的命令,但必须确保它是

有人知道如何在java ProcessBuilder中使用linux grep吗?为什么这段代码在应该返回“sing”时返回空字符串

尽管出于某种原因它是红色字体。那么我做错了什么

我做错了什么

非常明显的事情

比如说,
execve()
,您希望了解shell构造吗?没有


当然,您也不应该期望
ProcessBuilder
理解这些。虽然它没有
execve()
那么低,但它的级别足够低,以至于命令的参数是“原始”的。因此,在命令中,
实际上可以使用
ProcessBuilder
运行相同的命令,但必须确保它是由
bash
执行的。我更喜欢这种实用方法:

public static int runCmd(final String command) {
    Process process=null;
    int ret = 0;
    String[] finalCommand = new String[] { "bash", "-c", command };

    try {
        final ProcessBuilder processBuilder = new ProcessBuilder(finalCommand);
        processBuilder.redirectErrorStream(true);
        process = processBuilder.start();
        ret = process.waitFor();
        // stdout+stderr
        InputStreamReader isr = new InputStreamReader( process.getInputStream() );
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
          System.out.println(line);
        }
        //System.out.println("Program terminated!");
        process.destroy();
        br.close();
        isr.close();
    } 
    catch (IOException|InterruptedException e) { 
        e.printStackTrace(); 
    } 
    return ret;
}
然后称之为:

runCmd("grep -o \"sing\" <<<\"icansing\"");

在您的示例中,grep使用了一个参数(sing),而
虽然是一种可能性,但它几乎从来都不是正确的做法;可以说,它与臭名昭著的“system()”处于同样的糟糕程度……这仍然不会阻止程序员使用
system()
,公平地说,这样做的有效案例很少(但不是这个
grep
),这似乎是一种有用的方法。另外@fge假设您引用的是C“system()”函数,为什么它如此臭名昭著?你想分享什么链接?给回答者尽管你给出了正确的答案,但你对OP不必要的傲慢或粗鲁,无视这样一个事实,即对你来说显而易见的事情对提问者来说可能是一个谜,如果他当时知道提问的意义何在?@qualebs好的,我同意,我可以重新表述我的答案,但让我不安的是,这是操作系统编程101。2017年编程课程仍然没有教授这种(非)微妙之处,这让我感到困惑
 grep "sing" <<<"sing"
sing
echo foobar | grep foo
public static int runCmd(final String command) {
    Process process=null;
    int ret = 0;
    String[] finalCommand = new String[] { "bash", "-c", command };

    try {
        final ProcessBuilder processBuilder = new ProcessBuilder(finalCommand);
        processBuilder.redirectErrorStream(true);
        process = processBuilder.start();
        ret = process.waitFor();
        // stdout+stderr
        InputStreamReader isr = new InputStreamReader( process.getInputStream() );
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
          System.out.println(line);
        }
        //System.out.println("Program terminated!");
        process.destroy();
        br.close();
        isr.close();
    } 
    catch (IOException|InterruptedException e) { 
        e.printStackTrace(); 
    } 
    return ret;
}
runCmd("grep -o \"sing\" <<<\"icansing\"");
sing