Java 无法使用运行时或ProcessBuilder执行排序命令

Java 无法使用运行时或ProcessBuilder执行排序命令,java,shell,command-prompt,Java,Shell,Command Prompt,我正在尝试使用JavaRuntime和ProcessBuilder执行此命令sort--field separator=“,”--key=2/home/dummy/Desktop/sample.csv“-o/home/dummy/Desktop/sample.csv 我可以在linux中手动执行此命令,但使用运行时或ProcessBuilder时,此命令不会执行。它返回一个错误代码=2 编辑: 如果我试图通过Java在linux中执行'ls'命令,我将获得当前目录中的文件列表。但是,如果我试图执

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

我可以在linux中手动执行此命令,但使用
运行时
ProcessBuilder
时,此命令不会执行。它返回一个
错误代码=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){}
    }
}
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();

}

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

  • 需要已经创建输出文件
  • “,”字段分隔符周围不需要引号(请参见下面的代码)
  • 因此,在这两个问题之后(都使程序以“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”一期,请阅读这篇伟大的文章:

    本文基本上解释了Runtime.exec(和ProcessBuilder包装器)用于运行进程,而不是Shell(您正在尝试的ls | grep实际上是Linux中通过stdout/in相互通信的两个进程)

    我可以手动执行。错误代码2意味着误用了Shell内置程序

    在您的示例中,我看到您只调用了“ls”,而不是“/usr/bin/ls”(或类似的东西)

    当您手动执行时,您可以使用
    PATH
    环境变量,这对您创建的流程不可用


    使用“
    which ls
    ”来发现“ls”在目标系统上的位置。要使代码可移植,您必须将其设置为可配置选项。

    这是执行任何bash命令的方法,如sort、ls、cat(带子选项)。请查找代码段:

    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){}
        }
    }
    
    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命令将被执行,您可以继续执行下一个任务。希望这有帮助。

    如果您搜索了错误代码2,则意味着无法执行该命令found@MadProgrammer但我可以手动执行。错误代码2意味着滥用Shell内置什么操作系统?什么是
    sort
    ?通常
    2
    意味着在尝试执行命令时,在大多数操作系统上找不到文件。问题是寻求调试帮助(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。请参阅。根据我在Windows上使用ProcessBuilder运行bulit in命令(路径)的经验我必须调用CMD.EXE/C,否则我会得到相同的错误。但是OP似乎正在运行Unix/Linux。不..请运行您的代码。它返回的错误代码是2。我已经附上了答案。请找到它。不,我工作得很好!您在/tmp目录中有这两个文件吗(请注意,我更改了文件的位置,只是为了在我的电脑上测试它)?您所做的是一个不必要的解决方法。请重新运行我的代码,我保证它工作正常,并且是您所需要的。谢谢!它像一个符咒一样工作。之前,我没有更改文件路径。对于其他命令,这通常是正确的,但是ls和cd专门内置在shell中,并且在/usr/bin或其他任何地方都不可用于该matter、 你确定吗?至少在我的系统中有一个名为
    /bin/ls
    的二进制文件。我在这里查看了一下,它没有将
    ls
    列为shell内置文件之一…-事实上,他的页面给出了一个命令,你可以用它来测试:
    键入-a ls