无法使用ProcessBuilder中的Bash的“ -i”选项

时间:2018-10-14 01:04:57

标签: java linux processbuilder io-redirection

我的程序的目标是从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 :(得分:0)

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/dev/tty上的读取句柄替换脚本的stdin(FD 0)。如果您只想针对单个命令而不是整个脚本执行此操作,请在该命令的末尾放置</dev/tty

当然,仅当您的进程在完全具有控制终端的上下文中运行时,此方法才有效-但是,如果不是这种情况,您将无法从用户而不会在I / O设备上获得某种句柄。