[英]Runtime.exec not working
我正在尝试运行以下代码来交换文件名。 我正在使用Runtime.exec
。 代码抛出IOException
。 有任何解决这个问题的方法吗?
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;
}
而错误:
02-28 07:48:02.936:W / System.err(14399):java.io.IOException:运行exec()时出错。 命令:[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”]工作目录:null环境:null
看起来Runtime.exec在每个&&之前和之后插入一个昏迷 。 似乎问题在于Runtime.exec解释&&的方式 。 为什么会这样? 我怎么能阻止这个?
如果使用Runtime.exec(String)
重载,则将字符串视为命令及其参数,并粗略地拆分为白色空间边界处的子字符串。 这种分裂是该过载的标准行为。 (请参阅javadoc。)
Runtime.exec(...)
需要本机命令及其参数。 你提供了一系列shell输入。 exec方法不了解shell输入,也不知道如何正确执行它。 原油分裂(见上文)会弄乱一切。
如果您需要这样做,请使用以下内容:
String yourShellInput = "echo hi && echo ho"; // or whatever ...
String[] commandAndArgs = new String[]{ "/bin/sh", "-c", yourShellInput };
Runtime.getRuntime().exec(commandAndArgs);
这相当于运行:
$ /bin/sh -c "echo hi && echo ho".
如果未安装sh
作为/bin/sh
使用安装它的路径。
首先问题不是你想的“看起来Runtime.exec在每个&&之前和之后插入一个逗号”实际上错误语句报告你在Runtime.exec()中给出的命令为String数组(String [ ])。 这是Java Runtime.exec()方法的标准行为。
02-28 07:48:02.936:
W/System.err(14399): java.io.IOException:
Error runningexec(). 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
您可以在错误中看到Java如何解释您硬编码的命令,您回来的String数组显示“file1 = / mnt / sdcard / fsimages_3”被视为要执行的打开命令,其余为“&&” , “ file2 = / mnt / sdcard / fsimages“等被视为参数。
我认为你应该做的是首先尝试将命令拆分为类似结构的数组。 以下是一个例子
Process process;
String[] commandAndArgs = new String[]{ "/bin/sh", "mv", "/mnt/sdcard/fsimages_3","/mnt/sdcard/fsimages" };
process = Runtime.getRuntime().exec(commandAndArgs);
接下来,您的错误显示您的工作目录为null,您的Environment也为null。 所以你需要为你的过程设置它们。 从Java文档中,您可以看到它声明了这个exec()重载方法
exec(String[] cmdarray, String[] envp, File dir)
在具有指定环境和工作目录的单独进程中执行指定的命令和参数。
如果没有任何说明可行,我请求您为您的命令编写一个shell脚本文件,然后使用它设置它可执行文件
chmod 755 or chmod +x script.sh;
然后尝试运行它。 我希望它在我的情况下工作,脚本文件方法工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.