Como limpar a entrada no Bash

2

Eu tenho um script bash que está lendo um pouco de dados / dev / random. Eu preciso que o usuário digite aleatoriamente para semear o daemon aleatório. No entanto, uma vez que o script conclua, tudo será digitado na entrada de comando. Aqui está o código:

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 "3[s"
    while [[ $(jobs) != *Exit* ]]  #while the program is still running 
    do
        for j in ${spinny_thing[@]} #now spin
        do 
           echo -en "3[u3[1D$j        "
        done
    done
    echo ""
    num='expr $num + 1'
done

Então, eu gostaria de poder despejar a entrada padrão sem interromper o processo de primeiro plano, então read está fora porque ele faz uma pausa. Seria possível como mapear /dev/null ?

    
por Micah 24.07.2014 / 22:15

2 respostas

3

Se você entender o que está querendo, use read para atingir sua meta. No entanto, você não quer que o read fique lá bloqueando indefinidamente, então você passa um tempo limite.

Por exemplo:

#!/bin/bash

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

Você pode digitar o que quiser enquanto sleep estiver sendo executado. Quando terminar, o bash invocará o read , que irá sugar tudo o que estiver no buffer STDIN.
O -N faz com que read coloque o terminal no modo de caractere, em vez do modo de linha. Isso ocorre porque o emulador de terminal normalmente só envia os caracteres ao pressionar Enter . Então, se os caracteres forem inseridos sem pressionar Enter , eles aparecerão no prompt. O número é quantos caracteres para ler. Eu acho que o usuário não será capaz de digitar 10 milhões de caracteres no momento em que o script terminar.
O -t faz com que a leitura atinja o tempo limite após 0,01 segundos. Então, se o usuário não conseguir completar os 10 milhões de caracteres em 0,01 segundos, read desistirá e pegará o que foi digitado até agora.

    
por 24.07.2014 / 23:30
0

Normalmente, quando você executa um comando de forma assíncrona (ex., execute em segundo plano com & ) em um shell não interativo (por exemplo, um script de shell), e você não redireciona explicitamente a entrada padrão do comando, o shell redireciona para /dev/null , então isso não interfere no primeiro plano. Claro que o seu problema é que você deseja que o processo em segundo plano interfira no primeiro plano, no sentido de que você deseja que cat pegue a digitação aleatória do usuário e impedir que o shell interativo o veja.

Não sei ao certo como isso é portátil, mas parece que você pode ignorar esse comportamento do shell simplesmente usando <&0 para significar “Eu realmente quero que esse processo em segundo plano seja conectado à entrada padrão de primeiro plano”:

cat <&0 > /dev/null &

Eu testei isso um pouco mais nas últimas 10 horas, e (no meu, ainda muito limitado, testando) Ele sempre funciona para bash e às vezes (mas nem sempre) funciona para /bin/sh . YMMV.

    
por 25.07.2014 / 04:02