无法通过Java代码执行Unix命令

时间:2014-06-05 17:36:04

标签: java unix

case "BVT Tool":
    System.out.println("Inside BVT Tool");
    try {
        String[] command1 = new String[] {"mv $FileName /bgw/feeds/ibs/incoming/"};
        Runtime.getRuntime().exec(command1);
    } catch(IOException e) {
        System.out.println("execption is :"+ e);
        e.printStackTrace();
    }
    break;

我无法执行Unix命令。它显示以下异常:

java.io.IOException: Cannot run program mv $FileName /bgw/feeds/ibs/incoming/":
CreateProcess error=2, The system cannot find the file specified.

3 个答案:

答案 0 :(得分:1)

我同意@Reimeus的大多数观点,但我想指出,有理由你得到这个特定的错误信息是两个重载版本的exec之间的交叉污染:

String command1 = "mv $FileName /bgw/feeds/ibs/incoming/";
Runtime.getRuntime().exec(command1);

可行 - 允许在一个字符串if you use the overloaded version that expects a String

中指定命令及其参数
String[] command1 = new String[] {"mv", "$FileName", "/bgw/feeds/ibs/incoming/"};
Runtime.getRuntime().exec(command1);

也可以,因为它使用the exec version expecting a String array。该版本期望命令及其参数在单独的字符串

请注意,我在此假设$Filename实际上是文件的名称,因此不会进行基于shell的替换。

编辑:如果FileName是一个变量名称,您似乎在评论的其他地方建议,请尝试

String[] command1 = new String[] {"mv", FileName, "/bgw/feeds/ibs/incoming/"};

但是:用Commons IO你可以做到

FileUtils.moveFileToDirectory(new File(FileName), new File("/bgw/feeds/ibs/incoming/") , true);

JavaDoc

  1. 在Mac,Windows和Linux之间完全可移植(您的版本无法在Windows上运行)
  2. 更快,因为它不需要产生外部进程
  3. 在出现问题时为您提供更多信息。

答案 1 :(得分:0)

除了Runtime.exec是一种非常陈旧的运行命令的方法之外,

完整的String被解释为可执行命令。您需要在String数组中使用单个标记。另外你需要 使用shell来解释$FileName变量

String[] command1 = {"bash", "-c", "mv", "$FileName", "/bgw/feeds/ibs/incoming/"};

答案 2 :(得分:0)

首先,您应该使用ProcessBuilder。你拥有的命令是" mv"其余的应该是争论,

// I'm not sure about $FileName, that's probably meant to be a shell replace
// and here there is no shell.
ProcessBuilder pb = new ProcessBuilder("mv", 
    System.getenv("FileName"), "/bgw/feeds/ibs/incoming/");