我正在尝试使用Java sort --field-separator="," --key=2 /home/dummy/Desktop/sample.csv" -o /home/dummy/Desktop/sample_temp.csv
和Runtime
执行此命令ProcessBuilder
。
手动我可以在linux中执行此命令,但是使用Runtime
或ProcessBuilder
,此命令不会执行。它返回error code = 2
。
编辑:
如果我试图通过Java在linux中执行'ls'命令,我会得到当前目录中的文件列表。但是,如果我尝试执行命令'ls | grep a',抛出IOException,错误代码= 2。 这是片段:
public static void main(String[] args) throws IOException {
InputStream is = null;
ByteArrayOutputStream baos = null;
ProcessBuilder pb = new ProcessBuilder("ls | grep a");
try {
Process prs = pb.start();
is = prs.getInputStream();
byte[] b = new byte[1024];
int size = 0;
baos = new ByteArrayOutputStream();
while((size = is.read(b)) != -1){
baos.write(b, 0, size);
}
System.out.println(new String(baos.toByteArray()));
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try {
if(is != null) is.close();
if(baos != null) baos.close();
} catch (Exception ex){}
}
}
答案 0 :(得分:2)
您的代码可能存在一系列问题。因此,您没有提供我只能猜测的代码。
所以在这两个问题之后(两个程序都以'2'退出程序),这个代码实际上有效:
import java.io.IOException;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder(Arrays.asList("sort", "--field-separator=,", "--key=2", "/tmp/sample.csv", "-o",
"/tmp/sample_temp.csv"));
Process p = pb.start();
int returnCode = p.waitFor();
System.out.println(returnCode);
}
}
将打印'0'并正确排序文件。
对于'ls | grep'问题,请阅读这篇精彩的文章:http://www.javaworld.com/article/2071275/core-javahen-runtime-exec---won-t/core-java/when-runtime-exec---won-t.html
本文基本上解释了Runtime.exec(和ProcessBuilder包装器)用于运行进程而不是Shell(你正在尝试的ls | grep实际上是Linux中通过stdout / in进行通信的2个进程)。
答案 1 :(得分:0)
我能够手动执行。错误代码2表示错误使用Shell BuiltIns
我在你的例子中看到你只是在调用" ls"而不是" / usr / bin / ls" (或类似的东西)。
当您手动执行时,您拥有PATH
环境变量的奢侈品,而您所创建的流程无法使用该变量。
使用" which ls
"发现' ls'的位置在您的目标系统上。为了使您的代码具有可移植性,您必须将其作为可配置选项。
答案 2 :(得分:0)
这是执行任何bash命令的方法,如sort,ls,cat(带子选项)。请找到代码段:
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec("script.sh");
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
在exec()方法中,我传递了一个shell脚本,其中包含bash命令。将执行该linux命令,您可以继续执行下一个任务。希望这有用。