我有一个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。
答案 0 :(得分:1)
在谈论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.
所以如果你想看到那条消息,你应该确保你也在捕捉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库。