Java 不能使用&&;Runtime.exec()中的运算符&x2B;linux
我正在尝试使用下面粘贴的代码从Java运行一个可执行文件。通过在终端中使用&&操作符,我可以用一个命令导航到并运行可执行文件。我试图通过Runtime.getRuntime().exec()命令传递相同的命令,但它似乎不喜欢&&运算符。有人知道这方面的解决办法吗?在下面发布的代码中,我只是将“cd&&pwd”作为测试用例传递;一个更简单的命令,但仍然不起作用。谢谢Java 不能使用&&;Runtime.exec()中的运算符&x2B;linux,java,linux,bash,terminal,runtime.exec,Java,Linux,Bash,Terminal,Runtime.exec,我正在尝试使用下面粘贴的代码从Java运行一个可执行文件。通过在终端中使用&&操作符,我可以用一个命令导航到并运行可执行文件。我试图通过Runtime.getRuntime().exec()命令传递相同的命令,但它似乎不喜欢&&运算符。有人知道这方面的解决办法吗?在下面发布的代码中,我只是将“cd&&pwd”作为测试用例传递;一个更简单的命令,但仍然不起作用。谢谢 try{ int c; textArea.setText("Conv
try{
int c;
textArea.setText("Converting Source Code to XML");
//String[] commands = {"/bin/bash", "-c", "cd /home/Parallel/HomeMadeXML", "&&", "./src2srcml --position" + selectedFile.getName() + "-o targetFile.xml"};
String commands = "bash -c cd && pwd";
System.out.println(commands);
Process src2XML = Runtime.getRuntime().exec(commands);
InputStream in1 = src2XML.getErrorStream();
InputStream in2 = src2XML.getInputStream();
while ((c = in1.read()) != -1 || (c = in2.read()) != -1) {
System.out.print((char)c);
}
src2XML.waitFor();
}
catch(Exception exc){/*src2srcml Fail*/}
}
要运行命令,必须使用三个参数:
bash
可执行文件、-c
执行命令的标志,以及第三个shell命令
您试图通过5,其中最后三个是一个命令的单独片段
这里有一个例子。请注意,shell命令仅是一个参数:
String[] commands = { "/bin/bash", "-c", "cd /tmp && touch foobar" };
Runtime.getRuntime.exec(commands);
执行时,您会发现在
/tmp
中创建的文件foobar
,String commands=“bash-c'cd&&pwd'代码>如@anubhava所示,bash-c cd和&pwd
被shell解析为bash-c cd
,&
,pwd
,您需要将cd和&pwd
作为参数传递给-c
@anubhava,这样行吗?或者这将执行一个带有四个参数的命令“-c”
,“'cd”
,”&&“
,“pwd”
?他可能需要使用带有字符串[]
参数的exec()
。这意味着它使用了一个非常简单的标记器,不会解释单引号。我想使用exec()
和String[]arguments
会更好,OP也会在注释代码中显示它。这很有效。非常感谢你。然而,另一个问题出现了。在上面定义字符串“command”的注释行中,我试图传递的参数之一是前面选择的文件。调用“selectedFile.getName()”需要在引号之外进行。我想我可以在另一行中连接字符串,但是有更简单的方法吗?再次感谢您没有更简单的方法,但有更好的方法:commands={“bash”、“-c”、“touch\”$1\”、“_”,selectedFile.getName()
将名称作为参数传递给shell,可通过“$1”
访问。这样,无论文件名是什么,它都能工作,并且没有代码注入安全问题。如果我需要这样构造调用:commands={“bash”、“-c”、“cd dir&&./src2srcml--position FILENAME-o targetFile.xml”},那么我需要这样做:commands={“bash”、“-c”、“cd dir&&./src2srcml--position touch\“$1\”-o targetFile.xml”,selectedFile.getName();是这样吗?如果运行一个命令只能接受上面建议的3个参数,“\ux”代表什么?感谢使用-c
时,bash的非选项参数从0开始分配给shell的位置参数。由于$0
在规范上是命令名,因此我们提供了类似于“\ux”的伪名称。如果您添加了一个虚拟名称,您的命令就可以了。