我有一个调用(使用调用Runtime.getRuntime()EXEC。)bash脚本这样的Java应用程序:
read -e -p "Are you sure you want to do this? (y/n)? "
echo "$REPLY"
问题是,我从来没有提示部分从bash脚本(下称“你确定?”的文本)。
有没有办法从Java调用一个交互式bash脚本,这样我可以读取它的输出? 我需要它,以便能够确定我被问这问题由脚本(实际上它比这里介绍一个更大的脚本)。
如果我通过SSH通道运行从Java的过程中与-t标志(在T标志的口音,没有它不能正常工作),它工作正常。 但我想,以避免ssh到自己,才能正常运行脚本,或者更准确地说,正确读取其输出。
从bash的手册页谈论时read
:
-p prompt
Display prompt on standard error, without a trailing new‐
line, before attempting to read any input. The prompt is
displayed only if input is coming from a terminal.
所以,你应该确保你也捕获标准错误,如果你想看到的消息。 你或许可以做到这一点通过增加从Java调用它时, 2>&1
,但我不肯定,Java的调用将尊重这一点。
如果您使用的ProcessBuilder来调用它,你应该加入到呼叫redirectErrorStream(true)
的过程中获得通过标准输出标准错误读数可见。
我还没有试过这种验证自己,但这个页面建议重定向标准输出的过程中/dev/tty
,使其认为它是直接连接到控制台,用于Java进程。 所以,你会添加&>/dev/tty
重定向输出和错误到/dev/tty
,并希望这将得到它展现出来-尽管这可能有它显示在stderr
的控制Java进程,而不是子进程。 我不是太有把握。
如果你不能做到这一点,另一个要考虑的是将尝试修改脚本,所以它的echo -n "<msg>"; read REPLY
echo -n "<msg>"; read REPLY
所以提示会显示在stdout
的echo
,而不是完全不受read
OK,这里的交易。
正如埃里克指出,如果输入来自终端时才会显示提示,所以我需要一个伪终端来糊弄bash脚本。 我设法用做JPty库。