案例如下:
1)我有一个脚本somescript.sh。
2)在脚本结束时,有一个eval语句触发JAR的执行。
3)当执行JAR时,它会要求用户提供a / b / c选项作为可能的答案 - 重要的事实是这些问题来自JAR应用程序,因此控制台"逻辑& #34;关于这些问题是用Java编写的,而不是放在脚本本身。
问题:在执行JAR程序时,用户可以按箭头键,这将导致丑陋的结果,如^ [[A ^ [[B ^ [[C ^ [[D。
这个帖子澄清了丑陋的结果:Why the terminal shows "^[[A" "^[[B" "^[[C" "^[[D" when pressing the arrow keys in Ubuntu?
问题:如何在执行JAR时禁用箭头键?
答案 0 :(得分:7)
现在这是相当复杂的,但它仍然比没有好。
下面的代码是一个原始的BASH键过滤器,用于绕过光标键并在按Enter键时暂停任何输入。目前它缺乏退格支持,但如果需要,这也是可行的。
需要BASH 4.2或更高版本。
while true; do
read -s -N1 c1
read -s -N2 -t 0.001 c2
read -s -N1 -t 0.001 c3
case "$c1$c2$c3" in
$'\x0a' | $'') echo "";
break ;; # Enter
$'\x1b\x5b\x41') ;; # Up arrow
$'\x1b\x5b\x42') ;; # Down arrow
$'\x1b\x5b\x43') ;; # Right arrow
$'\x1b\x5b\x44') ;; # Left arrow
*) echo -n $c1$c2$c3 ;; # [guaranteed to be non-empty]
esac
done | tee >(stdbuf -o0 java -jar your_applet.jar)
read
是一个BASH内置函数,用于捕获键盘输入。echo
是一个BASH内置函数,用于打印它所说的内容。tee
将输出重定向到STDOUT和提供的文件。>()
是所谓的过程替代;它就像编写器的文件一样,并将生成的文件内容作为输入传递给括号内的命令。stdbuf
禁用输出缓冲,以防万一。 tee
和stdbuf
都是coreutils
的一部分,所以它们几乎无处不在(可能除了Android,但这是另一个故事)。
[UPD。]最后一行,改编:
done | tee >(stdbuf -o0 "$JAVA" $JAVA_OPTS -jar "$JBOSS_HOME/jboss-modules.jar" -mp "$JBOSS_MODULEPATH" org.jboss.as.domain-add-user "$@")
希望那可以工作。
[UPD2。] 最终!另一种解决方案!
只需在eval
之前添加:
stty=$(stty -g)
stty -ctlecho
trap "stty $stty" HUP INT QUIT PIPE TERM
好的,这也不完美(用户现在可以通过按光标键来移动屏幕......)但是这仍然比^[[B^[[A^[[D^[[C
更好