Runtime.exec help please

S

Steve Rainbird

I am trying to use Runtime.exec to run a command and pass it a parameter.

I need it to preserve the spaces in the parameter but cannot get it to work.

E.g

My code says

String cmd = "sh1 xxxx 1234";
Process child = Runtime.getRuntime().exec(cmd);

the sh1 bash shell says

echo '$@' = $@
echo '$1' = $1
echo '$2' = $2

When I run it it displays

$@ = xxxx 1234
$1 = xxxx
$2 = 1234

I want it to pass the code "as is" so as one parameter

So it would display

$@ = xxxx 1234
$1 = xxxx 1234
$2 =

I could even cope with

$@ = xxxx 1234
$1 = xxxx
$2 = 1234


I have tried different variation of single and double quotes without any
success.
 
D

Daniel Pitts

I am trying to use Runtime.exec to run a command and pass it a parameter.

I need it to preserve the spaces in the parameter but cannot get it to work.

E.g

My code says

String cmd = "sh1 xxxx 1234";
Process child = Runtime.getRuntime().exec(cmd);

the sh1 bash shell says

echo '$@' = $@
echo '$1' = $1
echo '$2' = $2

When I run it it displays

$@ = xxxx 1234
$1 = xxxx
$2 = 1234

I want it to pass the code "as is" so as one parameter

So it would display

$@ = xxxx 1234
$1 = xxxx 1234
$2 =

I could even cope with

$@ = xxxx 1234
$1 = xxxx
$2 = 1234

I have tried different variation of single and double quotes without any
success.

did you try:
String command = "sh1 \"first second\"";
Runtime.getRuntime().exec(command);

Alternatively, look into the the ProcessBuilder class, it gives you
more control over individual parameters. Its also more secure if
you're getting data from the user. Not completely secure mind you,
but it does make sure that arguments are escaped appropriately for
your shell.
 
S

Steve Rainbird

Daniel Pitts said:
did you try:
String command = "sh1 \"first second\"";
Runtime.getRuntime().exec(command);

Yep tried that.

I got

$@ = "xxxx 1234"
$1 = "xxxx
$2 = 1234"


BTW I have unset IFS in the shell

so if I just execute

sh1 "xxxxxx 1234"
it does exaclty what I need

$@ = xxxxxx 1234
$1 = xxxxxx 1234
$2 =
Alternatively, look into the the ProcessBuilder class, it gives you
more control over individual parameters. Its also more secure if
you're getting data from the user. Not completely secure mind you,
but it does make sure that arguments are escaped appropriately for
your shell.

I will look into ProcessBuilder thanks.
 
S

Steve Rainbird

Steve Rainbird said:
Yep tried that.

I got

$@ = "xxxx 1234"
$1 = "xxxx
$2 = 1234"


BTW I have unset IFS in the shell

so if I just execute

sh1 "xxxxxx 1234"
it does exaclty what I need

$@ = xxxxxx 1234
$1 = xxxxxx 1234
$2 =


I will look into ProcessBuilder thanks.



ProcessBuilder seems to be the solution thanks.

String cmd = "sh1";
String arg = "xxxx 1234";
Process child = new ProcessBuilder(cmd,arg).start();

$@ = "xxxx 1234"
$1 = "xxxx 1234"
$2 =
 
B

bugbear

Steve said:
I am trying to use Runtime.exec to run a command and pass it a parameter.

I need it to preserve the spaces in the parameter but cannot get it to work.

Consider "the other" entry point:
public Process exec(String[] cmdarray)
throws IOException

The parameters are "nicely separate" in the array,
as opposed to the entry point you're using:

public Process exec(String command)
throws IOException

I think what's causing your trouble is this behaviour:

Reading documentation is sometimes helpful.

BugBear
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,754
Messages
2,569,526
Members
44,997
Latest member
mileyka

Latest Threads

Top