2

我正在尝试在linux中执行:

command[0] = "~/test/bin/runScript_sh";
Runtime.getRuntime().exec(command);

但是得到一个异常 java.io.IOException: Cannot run program
error=2, No such file or directory

可能是因为它无法评估波浪号。

可以做什么?

4

4 回答 4

4

我会自己更换。

if(path.s.substring(0,1).contains("~"))
    path = path.replaceFirst("~",System.getProperty("user.home"));

这可以让你得到你想要的字符串。

于 2013-03-07T14:21:51.640 回答
2

当您在 shell 命令提示符下运行命令时,诸如~扩展、引用处理、通配符、$variable 扩展、输入/输出重定向和管道等都由 shell 处理......在它要求操作系统运行之前适合您的程序。

当您使用 运行命令时Runtime.exec,您有三个选择:

  • 编写没有任何外壳“时髦的东西”的命令
  • 复制 shell 在 Java 中的功能;例如用适当的东西替换前导波浪线1,或
  • 使用 exec 启动子 shell 来运行命令;例如

    Runtime.getRuntime().exec("/bin/sh", "-c", "~/test/bin/runScript_sh");
    

    在像这样的简单情况下,这可能是矫枉过正。但是,如果您尝试做更复杂的事情,那么子 shell 可以真正简化事情。


1 - 事实上,波浪线的完全兼容外壳的处理相当复杂。

于 2013-03-07T15:11:56.533 回答
2

您可以使用以下命令获取用户的主目录System.getProperty

command[0] = System.getProperty("user.home") + "/test/bin/runScript_sh";
于 2013-03-07T14:22:16.167 回答
1

诸如~和之类的项目$HOME是外壳扩展

您必须在程序中展开这些项目,然后替换它们(提示:从 os 属性中获取它们,请参阅页面)

于 2013-03-07T14:20:47.523 回答