【问题标题】:Can not use && operator in Runtime.exec() + linux不能在 Runtime.exec() + linux 中使用 && 运算符
【发布时间】:2014-11-10 17:00:27
【问题描述】:

我正在尝试使用下面粘贴的代码从 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*/}
            }

【问题讨论】:

  • 你试过了吗:String commands = "bash -c 'cd && pwd'";
  • 正如@anubhava 表示bash -c cd && pwd 被shell 解析为bash -c cd&&pwd,您需要将cd && pwd 作为参数传递给-c
  • @anubhava 这行得通吗?还是会执行带有四个参数"-c""'cd""&&""pwd'" 的命令?他可能需要使用带有String[] 参数的exec()This 暗示它使用一个非常简单的 Tokenizer 并且不会解释单引号。
  • 我想将exec()String[] arguments 一起使用会更好,并且OP 也会在注释代码中显示它。

标签: java linux bash terminal runtime.exec


【解决方案1】:

你想运行一个命令,你必须使用三个参数:bash 可执行文件,-c 执行命令的标志,以及第三个 shell 命令。

您正在尝试传递 5,其中最后三个是一个命令的各个片段。

这是一个例子。注意 shell 命令只是一个参数:

String[] commands = { "/bin/bash", "-c", "cd /tmp && touch foobar" };
Runtime.getRuntime.exec(commands);

执行后,您会发现在您的/tmp 中创建了一个文件foobar

【讨论】:

  • 那行得通。非常感谢。然而,另一个问题出现了。在上面的注释行中,我定义了字符串“命令”,我试图传递的参数之一是之前选择的文件。调用“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 个参数,那么“_”是什么意思?谢谢
  • 使用-c时,bash的非选项参数从0开始分配给shell的位置参数。由于$0是规范的命令名称,我们提供虚拟名称,如“_” .如果您添加一个虚拟名称,您的命令会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多