Bashで入力を消去する方法

Bashで入力を消去する方法

/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はそれを呼び出し、readSTDINバッファ内のすべてを吸収します。
製造元は-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/shYMMVで動作します。

関連情報