2010-08-26 12 views
6

Chcę zająć się procesem i przeanalizować go za pomocą trzech różnych programów. Mogłem używać nazwanych potoków, ale zamiast tego mogę użyć fd.Jak wprowadzić do fd zamiast nazwanych potoków?

Oto, co działa tak daleko:

 

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

cat p1|ap1 & 
cat p2|ap2 & 
 

P1 i P2 zostały stworzone z mkfifo. ap1 i ap2 są programami analitycznymi. Nie wiem, czy mówię to dobrze, ale czy istnieje sposób, aby zamiast tego zmienić numer na tee na dwa nowe? Coś takiego:

 

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

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

Odpowiedz

5

Prawie miał go:

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

Zauważ, że ap1 może być funkcją. Jeśli chcesz, aby funkcja aby mieć dostęp do argumentu skryptu, nazywają go z "[email protected]", czyli

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 

Jeśli powłoka nie obsługuje >() (bash, ksh i zsh zrobić, ale to nie POSIX), ale Twój system obsługuje jednak /dev/fd (większość komputerów, w tym Solaris, Linux, * BSD, OSX i Cygwin), może używać jawnego tasowania fd.

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

Ahh. To może zadziałać. Czy jest jednak jakiś sposób, aby polubić FD? ap1 i ap2 są dużymi komendami z potokami i tonami przełączników. Łatwiej będzie przeczytać, czy mogę użyć fd. – User1

+0

@ Użytkownik1: jest to zdecydowanie możliwe (i ma tę zaletę, że działa w powłokach, które nie obsługują '<()' and '>()'), ale składnia jest niezręczna. W tym przypadku prostsze byłoby zdefiniowanie funkcji "ap1" i "ap2" jako funkcji. – Gilles

+0

Jaka jest inna składnia? Zauważyłem, że używam instrukcji if w niektórych częściach skryptu, które modyfikują sposób wywoływania ap1 w zależności od parametrów wejściowych. '>()' prawdopodobnie nie zadziała zbyt dobrze w moim przypadku. Ale nie wiem, jak inaczej to nazwać. Jakieś pomysły? Dzięki za pomoc do tej pory. – User1

Powiązane problemy