2010-08-26 7 views
6

Desidero eseguire lo stdout di un processo e analizzarlo con tre programmi diversi. Sono stato in grado di usare named pipe, ma posso usare fd's.Come eseguire il tee in pipe di fd anziché in named

Ecco cosa funziona finora:

 

exec 3< <(myprog) 
tee p1 p2 >/dev/null <&3 

cat p1|ap1 & 
cat p2|ap2 & 
 

p1 e p2 sono stati creati con mkfifo. ap1 e ap2 sono programmi di analisi. Non so se lo sto dicendo bene, ma c'è un modo per tee in due nuovi fd invece? Qualcosa di simile a questo:

 

exec 3< <(myprog) 
tee >&4 >&5 <&3 

cat <&4|ap1 & 
cat <&5|ap2 & 
 

risposta

5

È quasi avuta:

myprog | tee >(ap1) >(ap2) >(ap3) >/dev/null 

noti che ap1 può essere una funzione. Se si desidera che la funzione di accedere al ragionamento di script, lo chiamano con "[email protected]", vale a dire,

ap1() { 
    # here the script arguments are available as $1, $2, ... 
} 
# ditto for ap2, ap3 
myprog | tee >(ap1 "[email protected]") >(ap2 "[email protected]") >(ap3 "[email protected]") >/dev/null 

Se la shell non supporta >() (bash, ksh e zsh fare, ma non è POSIX), ma Ciononostante, il tuo sistema operativo supporta /dev/fd (la maggior parte dei sistemi UNIX, inclusi Solaris, Linux, * BSD, OSX e Cygwin), è possibile utilizzare il fd shuffling esplicito.

{ { { myprog | tee /dev/fd/3 /dev/fd/4 | 
     ap1 >&2 
    } 3>&1 | 
    ap2 >&2 
    } 4>&1 | 
    ap3 >&2 
} 
+0

Ahh. Potrebbe funzionare. C'è un modo per giocare a fd? ap1 e ap2 sono comandi enormi con pipeline e tonnellate di interruttori. Sarà più facile leggere se posso usare una fd. – User1

+0

@ User1: è sicuramente possibile (e ha il vantaggio di lavorare in shell che non supportano '<()' and '>()'), ma la sintassi è scomoda. Qui sarebbe più semplice definire 'ap1' e' ap2' come funzioni. – Gilles

+0

Qual è l'altra sintassi? Ho appena notato che uso le istruzioni in alcune parti dello script che modificano il modo in cui viene chiamato ap1 in base ai parametri di input. '>()' probabilmente non funzionerà troppo bene nel mio caso. Ma non so come altro posso chiamarlo. Qualche idea? Grazie per il tuo aiuto finora. – User1