使用 read 和whiptail 运行脚本后终端上没有键盘输出

使用 read 和whiptail 运行脚本后终端上没有键盘输出

我编写了一个 bash 函数,它接受命令作为参数,在后台运行它,并允许用户通过按任意键终止该命令。这部分工作正常。

但是,当我通过管道将其传输到whiptail对话框仪表时,鞭尾按预期运行,但在返回后,终端将不再显示按键。我仍然可以运行命令,只是看不到我正在输入的内容打印到屏幕上。输出的格式也很奇怪,其中 stdout 出现在$.

我很确定该read命令造成了这种行为,但我不明白为什么。任何人都可以提供任何见解吗?

#!/bin/bash
function killOnKeypress() {
    local runcommand="${1}"
    local args=(${@:2})

    # Run the command in the background
    "${runcommand}" ${args[@]} &

    # Get the process id of $runcommand
    local pid=$!

    # Monitor $runcommand and listen for keypress in foreground
    while kill -0 "${pid}" >/dev/null 2>&1; do
        # If key pressed, kill $runcommand and return with code 1
        read -sr -n 1 -t 1 && kill "${pid}" && return 1
    done

    # Set $? to return code of $runcommand
    wait $pid

    # Return $runcommand's exit code
    return $?
}

function count100() {
    for ((i = 0; i < 100; i++)); do
        echo $i
        sleep .02
    done
}

killOnKeypress "count100" | whiptail \
    --gauge "Counting to 100" \
    16 56 \
    0

在此输入图像描述

答案1

虽然这不能回答OP问题,但对于其他来到这里寻找修复/解决方法的人来说可能很有用。

正如 NickD 在评论中指出的那样,鞭尾设置了 -echo(在我的环境中不仅仅是 echo)。

要修复您的脚本,您可以放置

stty echo

在它的最后。

您可以在脚本运行之前和之后使用“stty -a”查看脚本(whiptail)的更改。
当然,您可以将输出保存到文件中,以便更轻松地发现差异:

stty -a > good_terminal

运行你的脚本 - 你的终端被搞乱了,用“reset”或“tset”或“stty sane”重置它,然后再次运行“stty”命令,然后比较它:

stty -a > bad_terminal
diff good_terminal bad_terminal

答案2

这可能会使whiptail终端处于奇怪的状态。尝试stty sane作为命令(您必须盲输入它,所以要小心)。如果这修复了终端,那么这可能就是问题所在。

相关内容