Using Quotes within getRuntime().exec

EOF is NOT a character, so there's no way to write an EOF. You've forgotten to close a quoted string.


Use this:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

Main point: don't put the double quotes in. That's only used when writing a command-line in the shell!

e.g., echo "Hello, world!" (as typed in the shell) gets translated to:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(Just forget for the moment that the shell normally has a builtin for echo, and is calling /bin/echo instead. :-))


Windows command lines behave differently from UNIX, Mac OS X and GNU/Linux.

On Windows the process receives the input text verbatim after the executable name (and space). It's then up to the program to parse the command line (which is usually done implicitly, the programmer is often clueless about the process).

In GNU/Linux the shell processes the command line, guaranteeing the familiar array of strings passed to C's main function. You don't have that shell. The best approach (even on Windows) is to use one of the form of exec where you pass each command line argument individually in its own String.

Process exec​(String[] cmdarray)    
Process exec​(String[] cmdarray, String[] envp)     
Process exec​(String[] cmdarray, String[] envp, File dir)

Or better, java.lang.ProcessBuilder.

You can get a shell to do the parsing for you if you really want. This would make your example look something like (untested):

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});