tee sem fundo?

2

Eu estava apenas brincando no terminal e fiz isso:

printf 'some string\n' | {
    tee /dev/fd/3 | {
        : && sed 's/some/string/'
    }
} 3>&0

Fiquei realmente surpreso quando me depararam com uma tela cheia de:

string string
string string
string string
...

Continuou praticamente para sempre. Eu reduzi alguns, e para demonstrar melhor, talvez tente isto:

echo | tee /dev/fd/0 | sed =

Para mim, apresenta a saída como:

<num>
#blank
<num+1>
#blank
...

E assim por diante. As poucas vezes que tentei quando consegui acertar CTRL + C eu estava na linha 200k +. Eu tentei isso em bash , dash , sh e zsh e todos apresentam os mesmos resultados.

O que está acontecendo lá? Como os descritores de arquivos estão passando por cima de |pipe entre, o que eu pensei que fossem, processos separados? Isso é um comportamento confiável e / ou esperado? Existem outras maneiras de gerar esse efeito?

Para referência:

echo '#blank' | {
    uname -r
    readlink -f /dev/fd/0
    tee /dev/fd/0
} | sed '=;5q'

OUTPUT

1
3.14.6-1-ARCH
2
/proc/24925/fd/pipe:[5851017]
3
#blank
4
#blank
5
#blank
    
por mikeserv 18.06.2014 / 06:06

1 resposta

7

/dev/fd/0 é a entrada padrão do processo atual; tee escreve sua entrada para o (s) arquivo (s) fornecido (s) e para o stdout. Então tee está lendo uma linha (em branco), então escrevendo essa linha para ambos stdout ( sed ) e sua própria entrada, onde lê a linha que acabou de escrever, grava ela no stdout e sua própria entrada, etc. criando um loop infinito de linhas (vazias) *. O comando sed apenas imprime o número da linha e depois a linha.

echo --> tee --> sed
      ^---+

* Quando é fornecida mais entrada do que apenas um simples echo , este comando faz um loop sobre a entrada, repetindo-a repetidamente.

Nota: O OSX (BSD) não permite que você escreva para /dev/fd/0 , então você não pode fazer isso.

    
por 18.06.2014 / 06:19