以交互方式从Java调用bash

时间:2015-05-22 23:53:37

标签: java linux bash shell awk

我有一个Java应用程序,它使用这样的bash脚本调用(使用Runtime.getRuntime(。。exec):

read -e -p "Are you sure you want to do this? (y/n)? "
echo "$REPLY"

问题是,我从来没有从bash脚本中获得提示部分("你确定......"文本)。

有没有办法从Java调用交互式bash脚本,以便我可以读取它的输出?我需要它以便能够确定脚本要求我提出哪个问题(实际上它是一个比这里描述的更大的脚本)。

如果我使用-t标志从Java通过SSH通道运行该进程(t标志上的重音,没有它就不会工作),它可以正常工作。但我想避免为了正确地运行脚本,或者更确切地说,正确地读取它的输出而不得不ssh。

2 个答案:

答案 0 :(得分:1)

在谈论read

时,从bash手册页中
-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.

所以如果你想看到那条消息,你应该确保你也在捕捉stderr。您可以通过添加2>&1从java调用它来执行此操作,但我并不认为Java的调用会尊重它。

如果您正在使用ProcessBuilder来调用它,则应该在进程上添加对redirectErrorStream(true)的调用,以通过stdout读取来显示stderr。

我自己没有尝试过验证,但this page建议将进程的stdout重定向到/dev/tty,以使其认为它直接连接到java进程的tty。因此,您需要添加&>/dev/tty将stdout和stderr重定向到/dev/tty,并希望这会让它显示出来 - 尽管可能会显示在stderr上控制Java进程而不是子进程。我不太确定。

如果你不能这样做,另一件需要考虑的事情就是尝试修改脚本,使其执行echo -n "<msg>"; read REPLY,这样提示就会显示在stdout {{1}上而不是echo

完全没有

答案 1 :(得分:1)

好的,这是'这笔交易。

正如Eric指出的那样,只有当输入来自终端时才会显示提示,所以我需要一个伪终端来欺骗bash脚本。我设法使用JPty库。