无法使用Runtime或ProcessBuilder执行sort命令

时间:2014-09-03 06:08:46

标签: java shell command-prompt

我正在尝试使用Java sort --field-separator="," --key=2 /home/dummy/Desktop/sample.csv" -o /home/dummy/Desktop/sample_temp.csvRuntime执行此命令ProcessBuilder

手动我可以在linux中执行此命令,但是使用RuntimeProcessBuilder,此命令不会执行。它返回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){}
    }
}

3 个答案:

答案 0 :(得分:2)

您的代码可能存在一系列问题。因此,您没有提供我只能猜测的代码。

  1. 需要已创建输出文件
  2. ','字段分隔符不需要它周围的引号(请参阅下面的代码)
  3. 所以在这两个问题之后(两个程序都以'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命令,您可以继续执行下一个任务。希望这有用。