Невозможно использовать опцию Bash "-i" из ProcessBuilder - PullRequest
0 голосов
/ 14 октября 2018

Цель моей программы - запустить интерактивный исполняемый файл командной строки из Java, чтобы я мог добавлять ввод данных при необходимости.В основном перенаправление ввода.

Я не смог найти ничего, что работало в сети, потому что флаг -c не допускает интерактивность, но потом я увидел, что флаг -i в терминале позволяет мне запускать команды с интерактивнымвход, если я передал ему файл .sh.

Однако, когда я попытался использовать этот флаг в Java, он не работал.У меня есть отдельные потоки ввода и вывода, поэтому, если бы я мог заставить это работать, кажется, что это было бы легко.

Соответствующий код:

ProcessBuilder pb = new ProcessBuilder()
                    .directory(new File(testDir))
                    .inheritIO()
                    .command("bash", "-i"
                    ,"executor.sh");

            proc = pb.start();

это ошибка, которую я получаю:

bash: cannot set terminal process group (1469): Inappropriate ioctl for device
bash: no job control in this shell

Если бы я мог заставить эту опцию -i работать, я был бы признателен за указатели на что-то еще, что позволило бы мне заставить работать интерактивный ввод, потому что ничто из того, что я пробовал, кажется, не решает эту проблему.проблема.

1 Ответ

0 голосов
/ 14 октября 2018

bash -i полностью не связан со способностью чтения из TTY.

Скорее, перенаправьте из TTY, после того как ваш скрипт уже запущен:

#!/usr/bin/env bash
exec </dev/tty || { echo "ERROR: Unable to connect stdin to /dev/tty" >&2; exit 1; }
read -r -p "Fill out this prompt please: " value
echo "Read from TTY: $value"

Команда exec </dev/tty заменяет стандартный сценарий (FD 0) дескриптором чтения на /dev/tty.Если вы хотите сделать это только для одной команды, а не для всего сценария, поместите </dev/tty в конце этой команды.

Конечно, это работает, только если ваш процесс выполняется в контекстегде он имеет управляющий терминал вообще - но если бы это было не так, вы не могли бы читать от пользователя, не получив некоторый вид дескриптора ввода / выводаустройство независимо.

...