【问题标题】:Java execute a command with a space in the pathnameJava 执行路径名中带有空格的命令
【发布时间】:2011-02-06 23:25:12
【问题描述】:

如何执行路径名中有空格的 Java System (shell) 命令?

我试过加引号和反斜杠(),但它不起作用。

ln -s "dir1/dir2" "my\ dir/dir2"

【问题讨论】:

  • "my\ dir/dir2" 不是 Java 中的有效字符串,因为 "\ " 不是有效的转义序列。试试"my\\ dir/dir2"
  • 不,这是我打印字符串时的输出。我已经在使用“\\”
  • 啊,好吧。那还不清楚。您是否有机会使用 OS X? stackoverflow.com/questions/697621
  • 我很困惑 - 第二个路径中是否有文字反斜杠和空格或只是一个空格(反斜杠旨在“转义”空格)?

标签: java


【解决方案1】:

目前最可靠的方法是使用Runtime.exec(String[] cmdarray)

如果你使用Runtime.exec(String command),Java 只会在空格处分割命令。

使用由调用 new StringTokenizer(command) 创建的 StringTokenizer 将命令字符串分解为标记,而无需进一步修改字符类别。然后将分词器生成的令牌以相同的顺序放置在新的字符串数组 cmdarray 中。

另见g++: File not found

或者使用ProcessBuilder 类似这样的东西:

ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2");
Process p = pb.start();

【讨论】:

  • ProcessBuilder 是推荐的方式,因为它可以比 Runtime.exec() 更好地处理空格
  • 我实际上只是添加了一个使用基于 Javadocs 的 ProcessBuilder 的示例。你觉得合适吗?
  • 我试过用这个,但还是不行。我必须指定可执行文件的完整路径吗?
  • 你试试然后告诉我们怎么样? :-) 通过查看p.waitFor()p.exitValue() 返回的值,应该很明显是否有错误,如果有,错误是什么。例如,如果退出值为 127,那么是的,它找不到该命令,您应该尝试将其更改为 /bin/lsgetErrorStream 也会有更多信息。
  • 我还要注意,这个答案(希望)避免了命令注入攻击。如果您的进程使用 /bin/sh,则应注意命令注入。 owasp.org/index.php/Command_injection_in_Java
【解决方案2】:

您真的需要在 shell 中执行它吗(例如,您是否需要对 ~* 等内容进行 shell 扩展)?如果没有,你可以直接调用ln

Process p =
    Runtime.getRuntime()
    .exec(new String[]{"/bin/ln","-s","dir1/dir2", "my\\ dir/dir2"});

如果你真的需要一个 shell,试试这个(这可能需要稍微调整一下,具体取决于 shell 如何处理引号):

Process p =
    Runtime.getRuntime()
    .exec(new String[]{"/bin/sh", "-c", "ln -s \"dir1/dir2\" \"my\\ dir/dir2\""});

编辑:

我的印象是第二条路径中有一个文字反斜杠。如果不应该从上面的字符串文字中删除\\

【讨论】:

    【解决方案3】:

    这些都不适用于 Lion。但是,以下内容确实有效,并且向后兼容 Tiger。

    Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"});
    

    【讨论】:

      【解决方案4】:

      您可以通过以下方式使用它,而无需引入任何反斜杠: Runtime.getRuntime().exec(new String[]{"ln", "-s", "dir1/dir2", "my dir/dir2"});

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        • 2018-01-27
        • 2010-10-16
        • 1970-01-01
        • 2016-01-13
        • 2021-09-08
        相关资源
        最近更新 更多