I’m trying to run the following code to swap filenames. I’m using Runtime.exec
. The code throws IOException
. Anyway to fix this?
try { Runtime.getRuntime().exec("file1=" + folderpath + " && file2=/mnt/sdcard/fsimages && temp="$(/system/xbin/mktemp -dp /mnt/sdcard)" && /system/xbin/mv "$file1" $temp && /system/xbin/mv "$file2" "$file1" && /system/xbin/mv $temp/"$file1" "$file2""); } catch (IOException e) { e.printStackTrace(); return; }
And the error:
02-28 07:48:02.936: W/System.err(14399): java.io.IOException: Error running exec(). Command: [file1=/mnt/sdcard/fsimages_3, &&, file2=/mnt/sdcard/fsimages, &&, temp=”$(/system/xbin/mktemp, -dp, /mnt/sdcard)”, &&, /system/xbin/mv, “$file1”, $temp, &&, /system/xbin/mv, “$file2”, “$file1″, &&, /system/xbin/mv, $temp/”$file1”, “$file2”] Working Directory: null Environment: null
It looks like Runtime.exec is inserting a coma before and after every &&. Seems like the issue is in the way which Runtime.exec interprets &&. Why is this happening? How can I prevent this?
Advertisement
Answer
If you use the Runtime.exec(String)
overload, the string is treated as a command and its arguments, and is crudely split into substrings at white-space boundaries. This splitting is standard behaviour for that overload. (Refer to the javadoc.)
Runtime.exec(...)
expects a native command and its arguments. You’ve provided a line of shell input. The exec methods don’t understand shell input and don’t know how to execute it properly. And the crude splitting (see above) messes up everything.
If you need to do that, then use the following:
String yourShellInput = "echo hi && echo ho"; // or whatever ... String[] commandAndArgs = new String[]{ "/bin/sh", "-c", yourShellInput }; Runtime.getRuntime().exec(commandAndArgs);
This is equivalent to running:
$ /bin/sh -c "echo hi && echo ho".
If sh
is not installed as /bin/sh
use the path where it is installed instead.