Search code examples
javacmdexecag

How to run commands you can run on terminal in Java


So guys I want to execute a command that you can execute on the cmd in my Java program. After doing some study, I thought i found a way to do this. However, my code doesn't work.

My code is

import java.io.*;

public class CmdTest {
    public static void main(String[] args) throws Exception {
        String[] command = {"ag","startTimes conf.js >> pro.txt"};
        ProcessBuilder builder = new ProcessBuilder(command);
        builder.directory(new File("./test-java/"));
        Process p = builder.start();
    }
}

The program executes but produces no output. I tried using other commands like "ls -a", but still no output.

Can someone please help me debug this or suggest a better way of doing this? Thank you

Edit 1: I am executing this on a Mac. If that is necessary for debugging

Edit 2: The usual ls and other commands are working with the solutions that you guys have provided. I however want to use the ag (the_silver_searcher) command in the Java program. When i try that, i get the following error -

Exception in thread "main" java.io.IOException: Cannot run program "ag startTimes conf.js >> pro.txt": error=2, No such file or directory 

Solution

  • The existing answers give you the information on how to solve your problem in code, but they don't give a reason why your code is not working.

    When you execute a program on a shell, there's significant processing done by the shell, before the program is ever executed. Your command line

        String[] command = {"ag","startTimes conf.js >> pro.txt"};
        ProcessBuilder builder = new ProcessBuilder(command);
    

    assumes that the command ag is run with the single argument startTimes conf.js >> pro.txt - most likely not what you want to do. Let's go one step further: What if you wrote

        String[] command = {"ag","startTimes", "conf.js", ">>", "pro.txt"};
        ProcessBuilder builder = new ProcessBuilder(command);
    

    ?

    This would assume that the ag command knows about the >> parameter to redirect its output - and here is where the shell comes into play: The >> operator is an instruction to the shell, telling it what to do with the output from stdout of the process. The process ag, when started by the shell, never has an idea of this redirection and has no clue about >> and the target file name at all.

    With this information, just use the code samples from any of the other answers. I won't copy them into mine for proper attribution.