我想写一个执行某些Linux命令的java代码:
String cmd = "cd /home/arps/FBI" ;
Process p=Runtime.getRuntime().exec(cmd);
String [] arr = new String [9] ;
arr[0] = "cd /home/arps/FBI" ;
for(int n = 1 ; n < 9 ; n++){
String command = "mv" + " " + "/home/arps/FBI/hr" + n + ".txt" + " " + "/home/arps/FBI/hrs" + n +".txt" ;
arr[n] = command ;
}
Process pp=Runtime.getRuntime().exec(arr);
在上面的代码中:我尝试将名为hr1,hr2 ....的8个文件重命名为hrs1,hrs2 ...等。在cd命令中,我尝试输入所需的目录。但是,我也使用了绝对路径。但是代码给出了错误:
java.io.IOException: Cannot run program "cd": java.io.IOException: error=2, No such file or directory
java.io.IOException: Cannot run program "mv /home/arps/FBI/hr1.txt /home/arps/FBI/hrs1.txt": java.io.IOException: error=2, No such file or directory
任何人都可以帮助我,为什么会发生这种情况虽然我手动执行这些命令意味着"mv /home/arps/FBI/hr1.txt /home/arps/FBI/hrs1.txt"
并正确执行?
答案 0 :(得分:9)
cd
是当前shell的内置命令 - 你无法执行它 - 它是一个内置的shell,因为cwd是一个进程级设置,所以一个新的进程拥有它自己的值。有no way来改变java进程中的cwd。
exec
的{{3}}用于执行单个命令,您自己拆分参数,而不是执行多个命令。
因此,您需要提供完整路径,或者自己使用Java实现副本。
答案 1 :(得分:2)
从
更改程序的最后一行Process pp=Runtime.getRuntime().exec(arr);
为:
for (String cmdLine: arr) {
Process pp=Runtime.getRuntime().exec(cmdLine);
您将根据RunTime documentation分别执行每一行。
答案 2 :(得分:2)
你可能最好编写一个shell脚本来完成你需要的东西并从Java调用它。
答案 3 :(得分:0)
arr数组必须存储命令的参数。没有分开的命令。请参考我的问题。 run shell command from java
答案 4 :(得分:0)
如果ls -l /home/arps/FBI/hrs1.txt
没有像您在评论中所说的那样输出任何内容,那么您尝试重命名的文件根本就不存在,所以例外情况就是这样。
PS:恕我直言,这不是用Java完成的。使用脚本语言来做这些事情。方式更简单,代码更小。对于每个问题,尝试使用正确的工具,而不是一个工具用于解决所有问题。