Bash读取并在输入后也等待

在bash中,我想读取用户的按键输入,甚至在按下按键后也要等待。 我用

  $.ajax({
        url: "/Projects/Edit/",type: "POST",data: {
            __RequestVerificationToken: token,ProjectManagersString: $("#ProjectManagers").val(),//select 2 control value

        }
    })

但是在输入后它将停止等待。无论如何我要等0.05,然后将按下的第一键存储在可变键中。

gwt3344 回答:Bash读取并在输入后也等待

如注释中所指出,使用sleep。在sleep期间输入的所有内容都将打印在终端上(就像不消耗stdin的每个命令一样)。使用stty隐藏此输出。

  • stty -echo禁用输出。
  • stty echo启用输出(将显示到目前为止隐藏的未使用字符)。

您可能只想等待剩余时间,而不要再等待0.05秒。有两种方法可以这样做:

简单但可能不可靠的方法

使用sleep 之前 read –这样,您既不必测量等待时间,也不必计算剩余时间:

stty -echo
sleep 0.049
read -n1 -s -t0.001 key;
stty echo;

echo "key was $key"

read -t…超时必须足够长才能实际读取缓冲的字符。您可以通过将很长的行复制粘贴到终端中来进行测试-read仅会读取其中的一部分。在速度较慢的系统上,您可能必须增加0.001。但是请记住,用户的总等待时间可能只是睡眠时间,也就是说,-t越大意味着精度越低。

复杂但强大的方法

要解决该问题,您可以将sleep 放在 read之后并计算剩余的等待时间,这当然是更多的工作。这是bash 5.0或更高版本中的解决方案:

# all variables of the form tSomething are in μs = 10^-6 s
stty -echo
tStart="${EPOCHREALTIME/./}" 
read -n1 -s -t0.05 key;
tEnd="${EPOCHREALTIME/./}"
printf -v tWait %07d "$((tStart + 50000 - tEnd))" # 50000 μs = 0.05 s
sleep "${tWait:: -6}.${tWait: -6}"
stty echo

echo "key was $key"
本文链接:https://www.f2er.com/3132237.html

大家都在问