Вопрос по shell, java, bash – Выполнение сценариев оболочки из Java, сценарии оболочки с операцией чтения

2

У меня есть сценарии оболочки, которые читают вход

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

Я выполняю сценарии этой оболочки с использованием JAVA APi

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 я вижу вывод

Type the year that you want to check (4 digits), followed by [ENTER]:

Теперь актуальная проблема в том, как передать значения в сценарии оболочки в моих сценариях как переменная & quot; год & quot; можно прочитать

Я отредактировал код в соответствии с предложением, но не работает там, где мы его исправляем

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!");

Ваш Ответ

5   ответов
1

вы должны проанализировать входной поток, чтобы извлечь ваши значения. Разбери это по строкам.

спасибо алексей, как разобрать поток ввода, вы можете направить меня на этом anish
1

getOutputStream а также, чтобы иметь возможность записывать данные из вашей Java-программы в процесс.

public abstract OutputStream getOutputStream()

Gets the output stream of the subprocess. Output to the stream is piped into the standard input stream of the process represented by this Process object.

0

что это должно работать. Вам нужно обработать свой подпроцесс & apos; выходной поток. Прочитайтедокументы.

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

OutputStream изProcess учебный класс:

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

pw.println("1997");

То, что вы пишете в этот выходной поток, станет входным потоком сценария оболочки. Такread year будет читать 1987 кyear переменная.

EDIT:

Я также попробовал это, и мне удалось найти проблему. Строка 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();
        }
    }
}

Output:

$ java Test
Type the year that you want to check (4 digits), followed by [ENTER]:
1997
Program terminated!
@anish: Я нашел ошибку и обновил свой ответ рабочим примером.
спасибо buc любой живой код хочу поделиться, я скучаю по этой части anish
большое спасибо, это отлично работает anish
3

которая выполняет сценарий, используйте аргументы командной строки. Если вы хотите отправить информацию обратно из сценария в java-программу, напечатайте значение в сценарии, прочитайте STDOUT сценария в java-программе и проанализируйте его.

Вы действительно почти там. Теперь вы читаете вывод скрипта (в цикл while), но просто печатаете его. Разбери вывод и сделай с ним что нужно.

спасибо алекср разбирать вывод значит что? как этого добиться anish

Похожие вопросы