Java 不能使用&&;Runtime.exec()中的运算符&x2B;linux

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

我正在尝试使用下面粘贴的代码从Java运行一个可执行文件。通过在终端中使用&&操作符,我可以用一个命令导航到并运行可执行文件。我试图通过Runtime.getRuntime().exec()命令传递相同的命令,但它似乎不喜欢&&运算符。有人知道这方面的解决办法吗?在下面发布的代码中,我只是将“cd&&pwd”作为测试用例传递;一个更简单的命令,但仍然不起作用。谢谢

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”的伪名称。如果您添加了一个虚拟名称,您的命令就可以了。