Eventualmente.
Em:
cat /dev/random | strings --bytes 1 | tr -d '\n\t '
cat
nunca será compensado, mas é supérfluo de qualquer forma, pois não há nada para concatenar aqui.
< /dev/random strings --bytes 1 | tr -d '\n\t '
strings
, já que sua saída não é mais um terminal armazenará em buffer sua saída por blocos (de algo como 4 ou 8kB) ao contrário de linhas quando a saída vai para um terminal. / p>
Portanto, ele só começará a gravar para stdout quando tiver acumulado 4kB de caracteres para a saída, o que em /dev/random
demorará um pouco.
tr
vai para um terminal (se você estiver executando isso em um prompt do shell em um terminal), então ele armazenará em buffer sua linha de saída. Como você está removendo o \n
, ele nunca terá uma linha completa para gravar, então, em vez disso, ele gravará assim que um bloco inteiro for acumulado (como quando a saída não vai para um terminal). / p>
Portanto, tr
provavelmente não escreverá nada até que strings
tenha lido o suficiente de /dev/random
para escrever 8kB (2 blocos possivelmente muito mais) de dados (já que o primeiro bloco provavelmente conterá alguma nova linha ou caracteres de tabulação ou espaço).
Neste sistema que estou experimentando, posso obter uma média de 3 bytes por segundo de /dev/random
(em oposição a 12MiB em /dev/urandom
), portanto, no melhor cenário possível (os primeiros 4096 bytes de /dev/random
são todos imprimíveis), estamos falando 22 minutos antes de o tr
iniciar a saída de qualquer coisa. Mas é mais provável que sejam horas (em um teste rápido, posso ver strings
escrevendo um bloco a cada 1 ou 2 blocos lidos, e os blocos de saída contêm cerca de 30% dos caracteres de nova linha, então eu esperaria precisa ler pelo menos 3 blocos antes que tr
tenha 4096 caracteres para a saída).
Para evitar isso, você pode fazer:
< /dev/random stdbuf -o0 strings --bytes 1 | stdbuf -o0 tr -d '\n\t '
stdbuf
é um comando GNU (também encontrado em alguns BSDs) que altera o buffer stdio de comandos através de um truque LD_PRELOAD.
Observe que, em vez de strings
, você pode usar tr -cd '[:graph:]'
, que também excluirá tabulação, nova linha e espaço.
Você pode querer corrigir a localidade para C
para evitar possíveis surpresas futuras com caracteres UTF-8.