Habría supuesto que este código se habría impreso "uf" primero:
echo foo | tee >(rev) | ( sleep 1 ; cat ; )
Producción:
foo
oof
Aumentar el sleep
tiempo no cambia el orden. ¿Por qué eso no funciona?
Tenga en cuenta que otras herramientashacerfunciona como se supone,p.ej: echo foo | pee rev 'sleep 1 ; cat'
.
Respuesta1
En
echo foo | tee >(rev) | (sleep 1; cat)
En bash
like in ksh
, pero a diferencia de zsh
, la salida estándar de rev
also es la tubería a (sleep 1; cat)
.
echo
, tee
y rev
el (...)
subshell se inician al mismo tiempo, pero tee
escriben foo\n
en la salida estándarantesla tubería a rev
, por lo que, en cualquier caso, rev
escribirá oof
en la tubería después de tee
escribir foo
, por lo que oof
solo puede ser el último. El retraso cat
no tiene incidencia.
Si quisieras la salida derev
nopara pasar por la tubería hasta (sleep 1; cat)
, usarías zsh
o harías:
{ echo foo 3>&- | tee >(rev >&3 3>&-) 3>&- | (sleep 1; cat) 3>&-; } 3>&1
Tenga en cuenta que zsh
también tiene una función incorporada tee
, multios
por lo que puede hacer:
echo foo > >(rev) > >(sleep 1; cat)
Sin embargo en:
echo foo > >(rev) | (sleep 1; cat)
La salida de rev
pasaría cat
(confusamente considerando que no es así en el echo foo >(echo bar) | (sleep 1; cat)
caso).
Respuesta2
Usar dos bash
sustituciones de procesos (en lugar de solo uno, luego una tubería) y luego volcar el STDOUT a /dev/null funciona como se esperaba:
echo foo | tee >(rev) >( sleep 1 ; cat ; ) > /dev/null ; sleep 1
Producción:
oof
foo
Notas:
- el2do
sleep
previene "foo" se imprima después del símbolo del sistema. - reducir el
sleep
número de retraso a un nivel óptimo debería ser mejor, pero no estoy seguro de cuál debería ser ese número.1
es un poco lento, pero siempre parece funcionar;.01
no siempre funciona (es decir, la salida a veces está en el orden incorrecto),.1
parece funcionar bien.