/dev/randomから大量のデータを読み取るbashスクリプトがあります。ランダムデーモンをシードするには、ユーザーがランダムに入力する必要があります。ただし、スクリプトが完了すると、入力された内容はすべてコマンド入力にダンプされます。コードは次のとおりです。
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
だから私はフォアグラウンドプロセスを中断せずにstdinをダンプできるようにしたいので、一時停止して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秒後に読み取りがタイムアウトします。それで、ユーザーが1,000万文字を0.01秒以内に完了できない場合は、あきらめてread
これまでに入力したものを入手してください。
答え2
&
通常、非対話型シェル(シェルスクリプトなど)でコマンドを非同期(つまりバックグラウンドで実行)し、コマンドの標準入力を明示的にリダイレクトしない場合、シェルはそのコマンドを次にリダイレクトします/dev/null
。視聴者を邪魔しないでください。もちろん、あなたの問題はあなたです。考えるcat
ユーザーのランダムな入力をキャプチャし、インタラクティブシェルがそれを見ないようにするという意味で、バックグラウンドプロセスはフォアグラウンドを妨げます。
移植性がどれほど良いかはわかりませんが、<&0
「このバックグラウンドプロセスがフロント標準入力に接続されることを本当に望んでいます」を使用してシェルのこの動作をオーバーライドできるようです。
cat <&0 > /dev/null &
私は過去10時間でこれをもう少しテストしてきました(私のテストではまだ非常に制限的ですが)、常に動作し、bash
時には(常にそうではありませんが)/bin/sh
YMMVで動作します。