如何清除 Bash 中的输入

如何清除 Bash 中的输入

我有一个 bash 脚本正在读取大量数据 /dev/random。我需要用户随机键入以播种随机守护进程。然而,一旦脚本完成,输入的所有内容都将转储到命令输入。这是代码:

for i in ${users_thing[@]}
do
    pass[${num}] = $(dd if=/dev/random status=noexfer bs=1 count=128 | base64) & #generate password
    echo -n "Creating password: `expr $num + 1` of $sizes "     
#tell what's going of
    echo -en "\033[s"
    while [[ $(jobs) != *Exit* ]]  #while the program is still running 
    do
        for j in ${spinny_thing[@]} #now spin
        do 
           echo -en "\033[u\033[1D$j        "
        done
    done
    echo ""
    num=`expr $num + 1`
done

所以我希望能够在不中断前台进程的情况下转储标准输入,因此read由于它暂停而被淘汰。有可能如何绘制它/dev/null吗?

答案1

如果明白你想要什么,使用read应该可以实现你的目标。但是,您不希望read无限期地阻塞,因此您设置了超时。

例如:

#!/bin/bash

sleep 5
echo done sleeping
read -N 10000000 -t 0.01

您可以在sleep运行时输入任何您想要的内容。一旦完成,bash 将调用read它将吸收 STDIN 缓冲区上的所有内容。
制造-Nread将终端设置为字符模式,而不是行模式。这是因为终端仿真器通常只会在按 时发送字符Enter。因此,如果在未按 的情况下输入字符Enter,它们将显示在提示符处。数字是要读取的字符数。我认为在脚本完成时用户将无法输入 1000 万个字符。
-t使得读取将在 0.01 秒后超时。因此,如果用户无法在 0.01 秒内完成 1000 万个字符,read请放弃并获取到目前为止已输入的内容。

答案2

&通常,当您在非交互式 shell(例如 shell 脚本)中异步运行命令(即在后台运行它)时,并且您没有显式重定向该命令的标准输入,shell 会将其重定向到/dev/null,所以它不会干扰前景。当然你的问题是你后台进程干扰前台,从某种意义上说,你想要cat抓住用户的随机输入并阻止交互式 shell 看到它。

我不确定它的可移植性如何,但似乎您可以简单地通过使用<&0“我真的希望这个后台进程连接到前台标准输入”来覆盖 shell 的这种行为:

cat <&0 > /dev/null &

在过去的 10 个小时里,我对此进行了更多测试,并且(在我的测试中,仍然非常有限)它始终适用于bash,有时(但并非总是)适用于/bin/sh. YMMV。

相关内容