执行JAR时禁用箭头键

时间:2017-06-29 15:17:04

标签: bash jar sh

案例如下

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时禁用箭头键?

1 个答案:

答案 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禁用输出缓冲,以防万一。

teestdbuf都是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更好