我有一个 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 缓冲区上的所有内容。
制造-N
商read
将终端设置为字符模式,而不是行模式。这是因为终端仿真器通常只会在按 时发送字符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。