在Java中执行shell脚本并读取Output

piztneat  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(161)

我在java中使用下面的方法执行shell脚本

public static void main(String ar[])
{
  //key value are being read from properties file, here I am assigning the sample values      directly

   key=mine
   value="ls-1|tail-1"

  String[] cmd = { "jj.sh" , key,value};
  Process script_exec = Runtime.getRuntime().exec(cmd);
  script_exec.waitFor();
  if(script_exec.exitValue() != 0){
   System.out.println("Error while executing script");

  BufferedReader stdInput = new BufferedReader(new
                InputStreamReader(script_exec.getInputStream()));

  while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }
}

jj.sh文件包含以下值

#!/bin/sh

key=$1
value=`$2` 
echo $value

当我jj.sh直接使用键和值执行www.example.com时,它会给予我正确的值,即文件名。但是使用java时,它会将结果作为ls-1 result(意味着java忽略了'后面的命令|')。当我传递以波浪号分隔的键值时,它只显示完整的键值,即ls -1|tail -1
如何使用java执行完整的命令

yacmzcpb

yacmzcpb1#

这不起作用的主要原因是$2ls -1 | tail -1不同,即使$2被设置为该字符串。
如果您的脚本接受一个带有要执行的命令的文字字符串,则可以使用eval来执行。
我创建了一个完整的示例。请复制粘贴它并验证它是否有效,然后再尝试将其应用到您自己的代码中。下面是Test.java

import java.io.*;

public class Test {
  public static void main(String[] args) throws Exception {
    String[] command = { "./myscript", "key", "ls -t | tail -n 1" };
    Process process = Runtime.getRuntime().exec(command);
    BufferedReader reader = new BufferedReader(new InputStreamReader(
        process.getInputStream()));
    String s;
    while ((s = reader.readLine()) != null) {
      System.out.println("Script output: " + s);
    }
  }
}

myscript

#!/bin/bash
key="$1"
value=$(eval "$2")
echo "The command  $2  evaluated to: $value"

下面是我们如何单独运行myscript

$ ls -t | tail -n 1
Templates

$ ./myscript foo 'ls -t | tail -n 1'
The command  ls -t | tail -n 1  evaluated to: Templates

下面是运行Java代码的结果:

$ javac Test.java && java Test
Script output: The command  ls -t | tail -n 1  evaluated to: Templates
yks3o0rb

yks3o0rb2#

正如其他海报已经指出的那样,子过程不是在shell中开始的,所以she-bang没有被解释。
通过在www.example.com中的shell中显式地启动第二个参数的计算,我使您的示例能够工作jj.sh:

value=`sh -c "$2"`

不是很好,但工作。
另一个选项可能是在shell中显式启动脚本,模拟sh-bang:

String[] cmd = { "/bin/sh", "jj.sh" , key,value};

相关问题