【问题标题】:Execute bash script and pass arguments with spaces from java执行 bash 脚本并使用 java 中的空格传递参数
【发布时间】:2015-07-29 23:39:48
【问题描述】:

我知道有很多关于从 Java 执行命令的帖子,但我就是无法让它工作。这是我正在尝试做的事情,我有一个 bash 脚本,它接收 2 个可能有也可能没有空格的参数,然后从 Java 执行脚本并像这样传递参数(我正在围绕参数带引号并用反斜杠转义):

String cmd = "/opt/myScript  \"/opt/myPath1\"  \"/opt/myPath2 with spaces\"";
Runtime rt = Runtime.getRuntime();
rt.exec(cmd);

我也尝试像这样使用ProcessBuilder 类:

String myScript = "/opt/myScript";
String myArg1= "/opt/myPath1";
String myArg2 = "/opt/myPath2 with spaces";
ProcessBuilder pb = new ProcessBuilder(myScript , myArg1, myArg2);
pb.start;

成功接收没有空格的参数,但我仍然遇到第二个问题。

我认为 ProcessBuilder 类可以处理空格,但似乎我缺少了一些东西。

我不确定它是否有事可做,但以防万一这是我的脚本:

#!/bin/bash
PATH=$PATH:$1
gnome-terminal --working-directory $2

$1$2 是从 Java 发送的参数。

【问题讨论】:

  • 你有什么问题?您的脚本通过 ProcessBuilder 接收哪些值?
  • 你还需要在shell脚本中引用变量的展开。否则,shell 会在空格上分词。 (从技术上讲,它不会在分配行上执行此操作,但如果您想更加确定,引用那里会更安全。)
  • @Elliott,它现在可以工作了,我只是用引号将两个变量 $1$2 括起来,我想它也可以在 Mac 上工作,谢谢。

标签: java bash exec


【解决方案1】:

遇到同样的麻烦,终于解决了:

Runtime.getRuntime().exec(new String[]{"bash", "-c", <command with spaces>});

【讨论】:

  • 带 -c 选项,以下命令被读取为字符串,包含所有空格和特殊字符
【解决方案2】:

Runtime.exec() 是一个重载方法。有几种可能的方法来调用它。调用exec(String command) 执行指定的字符串命令,但参数在这里用空格分隔。方法exec(String[] cmdarray) 执行指定的命令和参数。还有其他 exec() 变体,但最适合您的是

String cmd[] = new String[] {"/opt/myScript", "/opt/myPath1", "/opt/myPath2 with spaces" };
Runtime rt = Runtime.getRuntime();
rt.exec(cmd);

可以使用 ProcessBuilder 也可以用于参数传递。我认为唯一的错误是在pb.start 之后缺少括号。

最后但并非最不重要的脚本有一个重大错误。它不包含 quutes arround $2。应该是

#!/bin/bash
PATH="$PATH:$1"
gnome-terminal --working-directory "$2"

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2015-10-21
    • 2013-06-10
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多