执行从Java,看了Shell脚本运行shell脚本(Executing Shell Scripts

2019-06-24 23:29发布

我有一个shell脚本读取输入

#!/bin/bash
echo "Type the year that you want to check (4 digits), followed by [ENTER]:"
read year
echo $year  

我执行使用Java API的这个shell脚本

ProcessBuilder pb = new ProcessBuilder("/bin/bash", "/junk/leaptest.sh");
final Process process = pb.start();

InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;


while ((line = br.readLine()) != null) {
    System.out.println(line);       
}
System.out.println("Program terminated!");

在Java控制台我可以看到输出

键入要检查(4位)的年,然后按[ENTER]:

现在如何将值传递给我的脚本中的shell脚本实际的问题是如何在varialble“年”可以读


我已编辑的代码为每建议,但不工作,我们纠正

ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "/junk/leaptest.sh");
final Process process = pb.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
/*
 * OutputStream os = process.getOutputStream(); PrintWriter pw = new
 * PrintWriter(os);
 */

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
while ((line = br.readLine()) != null) {
    System.out.println(line);
    // pw.println("8999");
    bw.write("2012");
}
System.out.println("Program terminated!");

Answer 1:

要通过从执行脚本的脚本中使用命令行参数的Java程序的值。 如果您要发送信息,从脚本到java程序后面打印脚本中的值,读剧本的STDOUT在java程序和解析它。

你真的几乎没有。 现在你正在阅读的脚本输出(入while循环),但你只是打印出来。 解析输出,并做你需要做什么用。



Answer 2:

您可以使用OutputStream中的Process类:

OutputStream os = process.getOutputStream();
PrintWriter pw = new PrintWriter(os);

pw.println("1997");

你写的输出流会变成什么样的shell脚本的输入流。 所以, read year会读1987年的year变量。

编辑:

我也尝试过了,我已经成功地发现问题。 1997年的弦还没有达到脚本,怎么一回事,因为PrintWriter缓冲已写入的数据。 您可能已冲洗PrintWriter后流println()pw.flush()或你有自动冲洗属性设置为true时创建:

PrintWriter pw = new PrintWriter(os, true);

这里是正在为我好完整的代码:

leaptest.sh:

#!/bin/bash
echo "Type the year that you want to check (4 digits), followed by [ENTER]:"
read year
echo $year

Test.java:

import java.io.*;

class Test {

    public static void main(String[] args) {
        try {
            ProcessBuilder pb = new ProcessBuilder("/bin/bash", "leaptest.sh");
            final Process process = pb.start();

            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
            PrintWriter pw = new PrintWriter(process.getOutputStream());
            String line;

            while ((line = br.readLine()) != null) {
                System.out.println(line);
                pw.println("1997");
                pw.flush();
            }
            System.out.println("Program terminated!");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

输出:

$ java Test
Type the year that you want to check (4 digits), followed by [ENTER]:
1997
Program terminated!


Answer 3:

想你应该分析输入流中提取你的价值观。 通过线解析它。



Answer 4:

你想使用建立一个OutputStream 的getOutputStream藏汉,要能够从Java程序将数据写入过程。

公共抽象的OutputStream的getOutputStream()

获得子进程的输出流。 输出到流管道输送到由该Process对象所表示的过程的标准输入流。



Answer 5:

我想,这应该工作。 你需要处理你的子进程输出流。 阅读文档 。

 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
 bw.write("2012");


文章来源: Executing Shell Scripts from Java, Shell scripts having read operation
标签: java bash shell