camiseta sin fondo?

camiseta sin fondo?

Estaba jugando en la terminal e hice esto:

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

Me sorprendió mucho cuando me encontré con una pantalla llena de:

string string
string string
string string
...

Continuó prácticamente para siempre. Lo reduje un poco y, para demostrarlo mejor, tal vez intente esto:

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

Para mí, presenta resultados como:

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

Etcétera. Las pocas veces que lo intenté cuando pude presionar CTRL+ Cestaba en la línea 200k+. Probé esto en bash, dash, shy zshtodos presentan los mismos resultados.

¿Que esta pasando ahí? ¿Cómo pasan los descriptores de archivos |pipeentre lo que pensé que eran procesos separados? ¿Es este un comportamiento confiable y/o esperado? ¿Existen otras formas de generar este efecto?

Para referencia:

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

PRODUCCIÓN

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

Respuesta1

/dev/fd/0es la entrada estándar del proceso actual; teeescribe su entrada tanto en los archivos que le proporciona como en la salida estándar. También lo teees leer una línea (en blanco), luego escribir esa línea tanto en la salida estándar ( sed) como en su propia entrada, donde lee la línea que acaba de escribir, la escribe en la salida estándar y en su propia entrada, etc., creando un bucle infinito de ( vacío) líneas*. El sedcomando simplemente imprime el número de línea y luego la línea.

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

* Cuando se proporciona más información que una simple echo, este comando recorrerá la entrada y la repetirá una y otra vez.

Nota: OSX (BSD) no le permite escribir en /dev/fd/0, por lo que no puede hacerlo.

información relacionada