执行JAR时禁用箭头键

Ins*_*ion 10 bash jar sh

案件如下:

1)我有一个脚本somescript.sh.

2)在脚本结束时,有一个eval语句触发JAR的执行.

3)当执行JAR时,它会要求用户提供a/b/c选项作为可能的答案 - 重要的事实是这些问题来自JAR应用程序,因此关于问题的控制台"逻辑"被写入在Java中并没有放在脚本本身.

问题是:在执行JAR程序时,用户可以按箭头键,这将导致丑陋的结果,如^ [[A ^ [[B ^ [[C ^ [[D.

这个帖子澄清了丑陋的结果:为什么终端在Ubuntu中按下箭头键时显示"^ [[A""^ [[B""^ [[C""^ [[D"]?

问题:如何在执行JAR时禁用箭头键?

hid*_*kgb 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)
Run Code Online (Sandbox Code Playgroud)
  • read 是一个BASH内置函数,可以捕获键盘输入.
  • echo 是一个BASH内置功能,可以打印它所说的内容.
  • tee 将输出重定向到STDOUT和提供的文件.
  • >()是所谓的过程替代; 它的作用类似于编写器的文件,并将生成的文件内容作为输入传递给括号内的命令.
  • stdbuf 禁用输出缓冲,以防万一.

这两个teestdbuf是部分coreutils,所以他们必须现在几乎无处不在(也许除了Android的,但that`s另一回事).

[UPD.]最后一行,改编:

done | tee >(stdbuf -o0 "$JAVA" $JAVA_OPTS -jar "$JBOSS_HOME/jboss-modules.jar" -mp "$JBOSS_MODULEPATH" org.jboss.as.domain-add-user "$@")
Run Code Online (Sandbox Code Playgroud)

希望那可行.

[UPD2.] 最后!不同的解决方案!

只需在此之前添加eval:

stty=$(stty -g)
stty -ctlecho
trap "stty $stty" HUP INT QUIT PIPE TERM
Run Code Online (Sandbox Code Playgroud)

好吧,这也不完美(用户现在可以通过按光标键来移动屏幕......)但是这仍然比 ^[[B^[[A^[[D^[[C