java 使用 shell 命令
java using shell commands
因此尝试使用“cp”将文件从一个位置复制到另一个位置 - 该文件以包含白色 space(“测试测试”)的文件名命名。在 shell (bash) 中调用命令时它工作正常,但从 java 调用它失败。我使用转义字符。代码:
import java.io.*;
public class Test {
private static String shellify(String path) {
String ret = path;
System.out.println("shellify got: " + ret);
ret = ret.replace(" ", "\ ");
System.out.println("shellify returns: " + ret);
return ret;
}
private static boolean copy(String source, String target) {
String the_command = ""; // will be global later
boolean ret = false;
try {
Runtime rt = Runtime.getRuntime();
String source_sh = shellify(source);
String target_sh = shellify(target);
the_command = new String
("cp -vf " + source_sh + " " + target_sh);
System.out.println("copy execing: " + the_command);
Process p = rt.exec(the_command);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader
(new InputStreamReader(is));
String reply = br.readLine();
System.out.println("Outcome; " + reply);
ret = (reply != null) && reply.contains("->");
} catch(Exception e) {
System.out.println(e.getMessage());
}
the_command = "";
return ret;
}
public static void main(String[] args) {
String source = "test1/test test";
String target = "test2/test test";
if(copy(source, target))
System.out.println("Copy was successful");
else
System.out.println("Copy failed");
}
}
...结果是这样
shellify got: test1/test test
shellify returns: test1/test\ test
shellify got: test2/test test
shellify returns: test2/test\ test
copy execing: cp -vf test1/test\ test test2/test\ test
Outcome; null
Copy failed
而如果我使用 bash 复制成功(大惊喜)。
Sino-Logic-IV:bildbackup dr_xemacs$ cp -vf test1/test\ test test2/test\ test
test1/test test -> test2/test test
谁能告诉我这是为什么?复制没有白色 spaces 的文件就可以了。
/dr_xemacs
您应该单独传递参数,它们不需要在 shellify 中转义,因为 String[] 版本的 exec 将每个参数作为一个参数单独提供给脚本,即使它们包含空格也是如此:
String[]the_command = new String[] {"cp","-vf", source, target);
如果 cp
不在某个 PATH 目录中,您可能需要修复 Java VM 可用的 PATH,或者您可以完全限定 [=13] 中可执行文件 cp 的路径=].
您的代码缺少一行来检查 cp
/ 进程退出代码,在使用 STDOUT / getInputStream()
:
后添加 waitFor
int rc = p.waitFor();
因此尝试使用“cp”将文件从一个位置复制到另一个位置 - 该文件以包含白色 space(“测试测试”)的文件名命名。在 shell (bash) 中调用命令时它工作正常,但从 java 调用它失败。我使用转义字符。代码:
import java.io.*;
public class Test {
private static String shellify(String path) {
String ret = path;
System.out.println("shellify got: " + ret);
ret = ret.replace(" ", "\ ");
System.out.println("shellify returns: " + ret);
return ret;
}
private static boolean copy(String source, String target) {
String the_command = ""; // will be global later
boolean ret = false;
try {
Runtime rt = Runtime.getRuntime();
String source_sh = shellify(source);
String target_sh = shellify(target);
the_command = new String
("cp -vf " + source_sh + " " + target_sh);
System.out.println("copy execing: " + the_command);
Process p = rt.exec(the_command);
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader
(new InputStreamReader(is));
String reply = br.readLine();
System.out.println("Outcome; " + reply);
ret = (reply != null) && reply.contains("->");
} catch(Exception e) {
System.out.println(e.getMessage());
}
the_command = "";
return ret;
}
public static void main(String[] args) {
String source = "test1/test test";
String target = "test2/test test";
if(copy(source, target))
System.out.println("Copy was successful");
else
System.out.println("Copy failed");
}
}
...结果是这样
shellify got: test1/test test
shellify returns: test1/test\ test
shellify got: test2/test test
shellify returns: test2/test\ test
copy execing: cp -vf test1/test\ test test2/test\ test
Outcome; null
Copy failed
而如果我使用 bash 复制成功(大惊喜)。
Sino-Logic-IV:bildbackup dr_xemacs$ cp -vf test1/test\ test test2/test\ test
test1/test test -> test2/test test
谁能告诉我这是为什么?复制没有白色 spaces 的文件就可以了。
/dr_xemacs
您应该单独传递参数,它们不需要在 shellify 中转义,因为 String[] 版本的 exec 将每个参数作为一个参数单独提供给脚本,即使它们包含空格也是如此:
String[]the_command = new String[] {"cp","-vf", source, target);
如果 cp
不在某个 PATH 目录中,您可能需要修复 Java VM 可用的 PATH,或者您可以完全限定 [=13] 中可执行文件 cp 的路径=].
您的代码缺少一行来检查 cp
/ 进程退出代码,在使用 STDOUT / getInputStream()
:
waitFor
int rc = p.waitFor();