在java中动态创建和执行bash命令的最佳方法?

在java中动态创建和执行bash命令的最佳方法?,java,bash,processbuilder,Java,Bash,Processbuilder,我正在开发一个Java机器人,它通过IRC消息接收用户的输入。用户输入类似.host file=foo file=bar hostname=“这是一个名称”的内容,它将根据他们的输入为他们启动服务器 现在我有了一个方法,基本上可以解析他们的消息,查找hostname=“”(必须用引号封装),拆分hostname=part,并将hostname设置为他们的结果(例如,hostname=“this a name”将变成-hostname“this a name”)。我用正则表达式来做这个 然后,我将

我正在开发一个Java机器人,它通过IRC消息接收用户的输入。用户输入类似.host file=foo file=bar hostname=“这是一个名称”的内容,它将根据他们的输入为他们启动服务器

现在我有了一个方法,基本上可以解析他们的消息,查找hostname=“”(必须用引号封装),拆分hostname=part,并将hostname设置为他们的结果(例如,hostname=“this a name”将变成-hostname“this a name”)。我用正则表达式来做这个

然后,我将字符串拆分为一个数组(用空格分隔),并将信息传递给processbuilder,processbuilder在自己的线程中执行该命令。最后一个命令如下所示:

./server-hostname“这是一个名称”

我遇到的一个问题是,由于我是按空格分割的,如果用户在主机名中添加一个破折号(例如,hostname=“this is-A name”),它会认为破折号是指一个参数,并且基本上会切掉其余部分

进一步解释:processbuilder将按空格分割,因此它将传递“-hostname”、“this”、“is”、““-”、“a”、“name”。这就是我遇到的问题,因为-意味着我应该传递一个参数,但我并不是用它来传递的

实现这一点的最有效方法是什么,以便传递的任何字符都只是字面上的这个字符?我是否应该在空格处拆分?如果我从linux shell中运行./server-hostname“this is-a name”,它将正常运行


非常感谢您的帮助。谢谢!

Runtime.exec和ProcessBuilder都将提供一个命令列表

Runtime.exec(new String[]{"./server", "-hostname", "this is - a name"};
ProcessBuilder pb = new ProcessBuilder("./server", "-hostname", "this is - a name");

这基本上意味着每个元素都被传递给命令(第一个参数)作为单独的参数,这样您就不必担心空格和额外字符之类的问题。

我决定完全更改代码,使用正则表达式解析用户输入,而不是使用前面的方法并在空格处拆分。这意味着我可以简单地将输入作为完整的“+sv_hostname=“test-name”添加到Arraylist中而不是使用“+sv_hostname”、“test”、“-”和“name”.

一个试图让Runtime.exec不那么痛苦的项目。不确定这是不是最好的方法,但阅读源代码可以让你很好地了解如何与运行时交互。exec:实际上是重复的:我认为它们非常不同。我已经通过Mikel的建议将字符串拆分为数组。我遇到的问题是,由于d是动态的,确保-,不被解释为我试图传递一个参数,而是字面上的字符'-'。