我的程序的目标是从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选项正常工作,那么我将感谢指向其他可以使交互式输入正常工作的指针,因为我尝试过的其他方法似乎都无法解决该问题。
答案 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设备上获得某种句柄。