Using Quotes within getRuntime().exec
Asked Answered
F

6

26

I'd like to invoke bash using a string as input. Something like:

sh -l -c "./foo"

I'd like to do this from Java. Unfortunately, when I try to invoke the command using getRuntime().exec, I get the following error:

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

It seems to be related to my string not being terminated with an EOF.

Is there a way to insert a platform specific EOF into a Java string? Or should I be looking for another approach, like writing to a temp script before invoking "sh" ?

Fourlegged answered 2/10, 2008 at 11:43 Comment(2)
Do you get the error at compile time or at run time?Photoconductivity
What is the Java code you used to invoke bash? The strings that you use in that Java code seem to be wrong. Unfortunately, they are missing in the post, making it not particularly useful...Alidus
A
53

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. :-))

Aundrea answered 2/10, 2008 at 11:54 Comment(0)
C
12

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;\""
});
Checkrow answered 2/10, 2008 at 14:26 Comment(0)
S
4

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

Silberman answered 2/10, 2008 at 11:45 Comment(0)
S
0

The cause for this error is most likely a missing syntax token that bash expects but the string you pass ends before bash encountered it. Look for ifs, fors etc. that have no closing fi or done.

Shrieval answered 2/10, 2008 at 11:47 Comment(0)
T
0

Quotes need to be escaped when inside a string. Instead of writing " write \".

E.g.

strcpy(c, "This is a string \"with\" quotes");

Technique answered 2/10, 2008 at 12:5 Comment(0)
F
0

if I were you, I would write the contents of the string to a temp bashfile and see if bash executes that without any error. If that executes without an error, then I would consider debugging further;

Fluorometer answered 2/10, 2008 at 14:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.