在路径中使用波浪号执行bash脚本

时间:2013-03-07 14:18:21

标签: java linux bash exec

我正在尝试在linux中执行:

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

但得到例外 java.io.IOException:无法运行程序
error = 2,没有这样的文件或目录

可能是因为它无法评估代字号。

可以做些什么?

4 个答案:

答案 0 :(得分:4)

我会自己替换它。

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

它可以为您提供所需的字符串。

答案 1 :(得分:2)

您可以使用System.getProperty获取用户的主目录:

command[0] = System.getProperty("user.home") + "/test/bin/runScript_sh";

答案 2 :(得分:2)

当您在shell命令提示符下运行命令时,~扩展,引用处理,globbing,$ variable扩展,输入/输出重定向以及管道和子进程等操作都由shell处理...在它要求操作系统为您运行程序之前。

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

  • 编写命令时没有任何shell“funky stuff”
  • 复制shell在Java中的作用;例如用适当的东西 1
  • 替换领先的tildes
  • 使用exec启动子shell来运行命令; e.g。

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

    在这样的简单案例中,这可能有点过头了。但是如果你想要做更复杂的事情,那么子shell可以真正简化事情。


1 - 事实上,完全与shell兼容的波形处理相当复杂。

答案 3 :(得分:1)

~$HOME等项目是shell扩展

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