gpt4 book ai didi

java - 在 Java 中执行 shell 脚本并读取输出

转载 作者:太空狗 更新时间:2023-10-29 11:27:14 25 4
gpt4 key购买 nike

我在 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

当我直接使用key和value执行jj.sh时,它给了我正确的值,也就是文件名。但是,对于 java,它给我的结果是 ls -1 结果(意味着 java 忽略了“|”之后的命令)。当我传递以波浪号分隔的键值时,它只显示完整的键值,即 ls -1|tail -1

如何使用java执行完整命令

最佳答案

这不起作用的主要原因是 `$2``ls -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

关于java - 在 Java 中执行 shell 脚本并读取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com