Como redirecionar canais paralelos no bash?

0

Isso não funciona:

   $ head file | tee >(sort >&3) | paste <(cat <&3) -
   bash: 3: Bad file descriptor

mas espero que seja óbvio o que se pretende fazer, o equivalente a:

   $ head file | sort >temp1
   $ head file >temp2
   $ paste temp1 temp2

Qual é a maneira correta de criar e usar esse pipe paralelo?

(Suponha que "head" represente uma operação cara e estou ciente dos perigos do deadlock.)

    
por Ray 02.02.2018 / 18:28

1 resposta

0

Descobri que criar explicitamente outro canal primeiro faz o que eu queria fazer:

$ pipe3="$$.pipe3"
$ mkfifo $pipe3
...
$ head file_1 | tee >(sort >$pipe3) | (sleep 1; paste <(cat <$pipe3) - )
...
$ tail file_2 | tee >(sort -r >$pipe3) | (sleep 1; paste <(cat <$pipe3) - )
...
$ rm $pipe3

A necessidade de "dormir", e usar "$ pipe3" em vez de "& 3", torna isso um pouco menos elegante.

    
por 04.02.2018 / 17:00

Tags