我试图通过java在linux中运行shell命令。大多数命令都有效,但是当我运行以下命令时,我得到了一个execption,虽然它在shell中有效:
String command = "cat b.jpg f1.zip > pic2.jpg";
String s = null;
try {
Process p = Runtime.getRuntime().exec(command);
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}
System.exit(0);
}
catch (IOException e) {
System.out.println("exception happened - here's what I know: ");
e.printStackTrace();
System.exit(-1);
}
我在控制台中收到错误:
cat:>:没有这样的文件或目录
cat:pic2.jpg:没有这样的文件或目录
答案 0 :(得分:2)
问题是重定向。
cat:>:没有这样的文件或目录
解释此错误消息的方法:
cat
试图告诉您有关问题的信息>
确实,>
不是文件。根本不打算作为文件。它是一个重定向输出的shell操作符。
您需要使用ProcessBuilder
重定向:
ProcessBuilder builder = new ProcessBuilder("cat", "b.jpg", "f1.zip");
builder.redirectOutput(new File("pic2.jpg"));
Process p = builder.start();
答案 1 :(得分:1)
因为你需要启动一个shell(例如/ bin / bash)来执行你的shell命令,所以替换:
String command = "cat b.jpg f1.zip > pic2.jpg";
与
String command = "bash -c 'cat b.jpg f1.zip > pic2.jpg'";
答案 2 :(得分:1)
当你运行一个命令时,它不会像bash那样启动一个shell,除非你明确地这样做。这意味着您正在运行cat
,其中包含四个参数b.jpg
f1.zip
>
pic2.jpg
最后两个文件名称不存在,因此您会收到错误消息。
您可能想要的是以下内容。
String command = "sh -c 'cat b.jpg f1.zip > pic2.jpg'";
这将运行sh
,它将>
视为重定向输出的特殊字符。