【问题标题】:Java Runtime exec() not workingJava 运行时 exec() 不工作
【发布时间】:2016-11-12 23:48:38
【问题描述】:

我尝试像这样通过java 执行 shell 命令

if (Program.isPlatformLinux())
{
    exec = "/bin/bash -c xdg-open \"" + file.getAbsolutePath() + "\"";
    exec2 = "xdg-open \"" + file.getAbsolutePath() + "\"";
    System.out.println(exec);
}
else
{
    //other code
}
Runtime.getRuntime().exec(exec);
Runtime.getRuntime().exec(exec2);

但是什么都没有发生。当我执行此代码时,它会在控制台中打印/bin/bash -c xdg-open "/home/user/Desktop/file.txt",但不会打开文件。我也试过先调用 bash 再调用xdg-open-command,但没有变化。

这里有什么问题,我该如何解决?

编辑:调用的输出如下所示:

xdg-open "/home/user/Desktop/files/einf in a- und b/allg fil/ref.txt" xdg-open:意外的参数'in'

但这对我来说似乎很奇怪 - 为什么in之前的命令分隔符甚至整个路径都设置在引号中?

【问题讨论】:

  • 尝试通过将进程输出打印为shown in this question来检查是否有错误。也许您会遇到更具体的错误。
  • @BackSlash 我听从了您的建议,并将结果添加到我的原始帖子中。
  • "einf in a- und b" 这是包含空格的文件夹名称吗?
  • 查看this question,了解为什么在命令包含引号时Runtime.exec(String) 会失败。

标签: java bash shell runtime xdgutils


【解决方案1】:

请注意,您不需要xdg-open 来执行此操作。 您可以使用 java 平台无关的 Desktop API:

if(Desktop.isDesktopSupported()) {
    Desktop.open("/path/to/file.txt");
}

更新

如果标准方法仍然存在问题,您可以将参数作为数组传递,因为 Runtime.exec 不调用 shell,因此不支持或允许引用或转义:

String program;
if (Program.isPlatformLinux())
{
    program = "xdg-open";
} else {
    program = "something else";
}

Runtime.getRuntime().exec(new String[]{program, file.getAbsolutePath()});

【讨论】:

  • 这是我的第一个方法。但它似乎不起作用:xdg-open/home/user/Desktop/files/einf\ in\ a-\ und\ b/allg\ fil/ref.txt xdg-open: unexpected argument 'in\'
  • 您需要转义反斜杠。再次检查答案
  • 我无法使用Desktop 类,因为它似乎在某些设备上使整个应用程序崩溃(请参阅stackoverflow.com/questions/40554515/…
  • 你的代码也不行,和上面一样的错误。
  • 好吧,这似乎有效。那么您知道如何解决真正的问题,即 Desktop 类在某些设备上导致应用程序崩溃?
猜你喜欢
  • 2012-01-25
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多