繁体   English   中英

从Java运行Linux脚本

[英]Run linux Script from Java

我有以下java代码

ArrayList<String> argList = new ArrayList<>();
argList.add("Hello");
argList.add("World");
String[] args = argList.toArray(new String[argList.size()]);

Process p =Runtime.getRuntime().exec("echo '$1 $2' ", args);

结果是$1 $2但我想打印Hello World 有谁能够帮助我?

创建一个外壳以使用参数扩展:

ArrayList<String> command = new ArrayList<>();
command.add("bash");
command.add("-c");
command.add("echo \"$0\" \"$1\"");
command.addAll(argList);

Process p = Runtime.getRuntime().exec(command.toArray(new String[1]));

输出:

Hello World

您应该使用exec(String[] args)方法,而不是:

    String[] cmdArgs = { "echo", "Hello", "World!" };
    Process process = Runtime.getRuntime().exec(cmdArgs);
    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line = null;
    while ((line = in.readLine()) != null) {
        System.out.println(line);
    }

问题在于, exec()方法中的第一个参数不是脚本,而是脚本的名称。

如果要使用变量,例如$1$2 ,则应在脚本中执行此操作。

因此,您实际上可能想要的是:

    String[] cmdArgs = { "myscript", "Hello", "World!" };
    Process process = Runtime.getRuntime().exec(cmdArgs);
ArrayList<String> argList = new ArrayList<>();
argList.add("echo");
argList.add("Hello");
argList.add("World");

Process p =Runtime.getRuntime().exec(args);

这样, String[]将作为参数传递给echo

如果要使用$则必须编写一个shell脚本。

Echo将这样打印所有参数。 在您的情况下,'$ 1 $ 2'被解释为普通字符串。.由于它将始终打印所有arg,因此您可以使用如下所示的内容。

  ProcessBuilder pb= new ProcessBuilder().command("/bin/echo.exe", "hello", "world\n");

另一个选择是共同创建一个带有适当内容的小脚本,例如mycommands.sh

   echo $@ 
   echo $1 $2  
   #any such

然后,您调用脚本...

  ProcessBuilder pb= new ProcessBuilder().command("/bin/bash" , "-c", "<path to script > ", "hello", "world\n");

注意使用ProcessBuilder。 这是一个改进的api,而不是Runtime。(尤其是引用等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM