Использование Commons Exec для контекстно-зависимого исполнения

1

То, что я пытаюсь сделать, - просто запустить командный файл, который выполняет некоторую подготовительную работу, необходимую для успешного выполнения последующих команд (установка переменных среды и прочее). Чтобы доказать это, я собрал образец, который использует Commons Exec

public class Tester {

    public static void main(String[] args) throws Exception {
        Tester tester = new Tester();
        MyResultHandler handler = tester.new MyResultHandler();
        CommandLine commandLine = CommandLine.parse("bash");
        PipedOutputStream ps = new PipedOutputStream();
        PipedInputStream is = new PipedInputStream(ps);
        BufferedWriter os = new BufferedWriter(new OutputStreamWriter(ps));
        Executor executor = new DefaultExecutor();
        PumpStreamHandler ioh = new PumpStreamHandler(System.out, System.err, is);
        executor.setStreamHandler(ioh);
        ioh.start();
        executor.execute(commandLine, handler);
        os.write("export MY_VAR=test");
        os.flush();
        os.write("echo $MY_VAR");
        os.flush();
        os.close();
    }

    private class MyResultHandler extends DefaultExecuteResultHandler {

        @Override
        public void onProcessComplete(final int exitValue) {
            super.onProcessComplete(exitValue);
            System.out.println("\nsuccess");
        }

        @Override
        public void onProcessFailed(final ExecuteException e) {
            super.onProcessFailed(e);
            e.printStackTrace();
        }
    }
}

Но это печатает пустую строку вместо слова "тест". Любые подсказки?

Теги:
exec
command-line
apache-commons-exec

1 ответ

0
Лучший ответ

Отвечая на мой собственный вопрос, основываясь на отзывах с другого форума. Трюк состоит в том, чтобы добавить новый символ линии в конце каждой команды следующим образом:

 os.write("export MY_VAR=test\n");
 os.flush();
 os.write("echo $MY_VAR\n");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню