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