открытие оболочки и взаимодействие с использованием Java

Ранее я задавал тот же вопрос, но без ответа, и нашел несколько других вопросов, похожих на эту проблему здесь и здесь, но снова с нет адекватных ответов. Может кто-нибудь, пожалуйста, помогите мне с этим. Я пытаюсь открыть оболочку из Java и взаимодействовать с ней (записывать команды и читать вывод оболочки). Команды будут даваться пользователем, такие как изменение каталога, компиляция программы C и т. д. Список команд не является фиксированным.

Я также пробовал использовать метод /bin/bash -c и следующее.

Process p = new ProcessBuilder("xterm").start();

Process p = new ProcessBuilder("/bin/bash").start();

Спасибо, и я надеюсь, что проблема ясна.


person sol    schedule 17.02.2014    source источник
comment
Должна ли ваша Java-программа быть директором для исполняемой оболочки или она предназначена для запуска оболочки и предоставления пользователю возможности взаимодействовать с ней?   -  person user3159253    schedule 17.02.2014
comment
Я хочу запустить оболочку с перенаправлением некоторого каталога (Java изменит каталог оболочки с помощью команды cd). После запуска я хочу, чтобы пользователь мог с ним взаимодействовать.   -  person sol    schedule 17.02.2014
comment
Если вы хотите запустить интерактивную оболочку, вам действительно нужно запустить виртуальный терминал, одной оболочки недостаточно. Оболочка только обрабатывает команды, запускает процессы и связывает их вместе, но это не то, что отображает вывод в окне.   -  person Mzzl    schedule 17.02.2014
comment
Можете объяснить, для чего вам это нужно? Может быть, есть другой способ сделать это. Существует несколько реализаций интерактивных оболочек на языке Java, например оболочка Java java-shell.sourceforge.net rhino. developer.mozilla.org/en/docs/Rhino/Shell и beanshell.org   -  person Mzzl    schedule 17.02.2014
comment
Я хочу разработать профилировщик программ C на Java. Для правильной разработки модуля будет полезно, если пользователь сможет скомпилировать и выполнить код C через предоставленный GUI, не открывая отдельно терминал bash.   -  person sol    schedule 18.02.2014


Ответы (1)


Пример работоспособного решения будет почти таким, как показано ниже.

   Process process;

   rt = Runtime.getRuntime();

try 
{

    process = rt.exec(new String[]{"bash","-c","ls -al /home/"});

    log.warn("message to display");

    BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String line=null;

    while((line=input.readLine()) != null) {

        log.warn(line);
    }

    int exitVal = process.waitFor();

    log.warn("Exited with error code : "+ exitVal);

}
catch (IOException e) 
{
    log.warn("IO Execption 1 Happen : " + e.getMessage());
} 
catch (Exception e) 
{
    log.warn("Execption Happen : " + e.getMessage());
}
person Saddam Abu Ghaida    schedule 17.02.2014
comment
Это не совсем то, о чем просил плакат, но я все еще думаю, что это круто, что это сработало. - person Mzzl; 17.02.2014
comment
Я уже пробовал этот метод, но все равно спасибо за попытку. - person sol; 18.02.2014