关于java:Runtime.getRuntime().exec()在使用Linux more命令时挂起

Runtime.getRuntime().exec() hangs when Linux more command is used

这是一个非常具体的问题,我在任何地方都找不到任何线索。因此,我使用运行时.GeTrimeMe()(Excel)来从Java程序中调用许多不同的Linux命令。当我应用一些细微的更改(是否使用bash和字符串数组)时,下面的代码几乎适用于任何类型的Linux命令。

1
2
3
4
command ="ls -l | grep something";
strArr1 = new String[]{"/bin/sh" ,"-c", command};
p1 = Runtime.getRuntime().exec(strArr1);
exitVal = p1.waitFor();

但是,当我使用以下命令时,我的程序挂起并且没有完成处理:

1
command ="more file0.txt";

我还尝试了不同的变体,例如下面的一个给出了错误:

1
2
3
4
command ="more keywords/file0.txt";
strArr1 = new String[]{command};
p1 = Runtime.getRuntime().exec(strArr1);
exitVal = p1.waitFor();

1
2
3
command ="more keywords/file0.txt";
p1 = Runtime.getRuntime().exec(command);
exitVal = p1.waitFor();

错误是:

1
There was a problem:java.io.IOException: Cannot run program"more keywords/file0.txt": error=2, No such file or directory

的确,file0.txt存在。

所以,我想知道linux命令more是否在runtime.getruntime().exec()中工作?我真的需要这个命令工作,因为它为其他命令生成结果。事先谢谢。


您的程序挂起是因为在shell中执行的more命令要求用户点击enter/whitespace继续滚动。当从Java执行时也会发生同样的情况。如果需要输出到stdout,您可能需要尝试使用cat


是的,您不应该像其他许多人指出的那样使用more,但您所犯的错误可能是因为您正在对不存在的文件执行more…至少不在more运行的地方。

试着把你的文件的完整位置和错误应该消失。

例如,如果文件位于根临时文件夹中,请执行

more /temp/keywords/file0.txt

如果你不知道文件的位置,pwd应该告诉你文件在哪里。转到文件file0.txt的文件夹,在那里执行pwd