从Java交互调用Bash(Invoking bash from Java interactivel

2019-10-23 04:34发布

我有一个调用(使用调用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到自己,才能正常运行脚本,或者更准确地说,正确读取其输出。

Answer 1:

从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所以提示会显示在stdoutecho ,而不是完全不受read



Answer 2:

OK,这里的交易。

正如埃里克指出,如果输入来自终端时才会显示提示,所以我需要一个伪终端来糊弄bash脚本。 我设法用做JPty库。



文章来源: Invoking bash from Java interactively