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

时间:2012-10-12 19:57:09

标签: java bash processbuilder

我有一个我正在研究的Java机器人,它通过IRC消息从用户那里获取输入。用户键入类似.host文件= foo file = bar hostname =“这是一个名称”,它将根据他们的输入为他们启动服务器。

现在我有一个方法基本上解析它们的消息,查找hostname =“”(必须用引号封装),拆分hostname = part,并将主机名设置为它们的结果(例如,hostname = “这是一个名字”将成为-hostname'这是一个名字')。我正在使用正则表达式来做到这一点。

然后我将字符串拆分成一个数组(用空格分隔)并将信息传递给processbuilder,后者在自己的线程中执行命令。最后的命令看起来像这样:

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

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

进一步说明:processbuilder将按空格分割,因此它将传递“-hostname”,“this”,“is”,“ - ”,“a”,“name”。这是我遇到麻烦的地方,因为 - 意味着我应该通过一个论点,但这不是我用它的原因。

实现这个的最有效方法是什么,以便传递的任何字符只是字面上的这个字符?我不应该在太空中分裂吗?如果我从linux shell运行./server -hostname“这是 - 一个名字”,它将运行良好。

我感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

Runtime.exec和ProcessBuilder都将获取命令列表。

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

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

答案 1 :(得分:0)

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