2010-08-26 49 views
6

我想獲取一個進程的標準輸出並使用三種不同的程序進行分析。我已經能夠使用命名管道,但是我可以使用fd代替。如何使用fd而不是命名管道

這裏是到目前爲止是什麼在起作用:

 

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

cat p1|ap1 & 
cat p2|ap2 & 
 

P1和P2用mkfifo創建。 ap1和ap2是分析程序。我不知道我是否說得對,但有沒有辦法將tee分成兩個新的fd?事情是這樣的:

 

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

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

回答

5

你幾乎擁有了:

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

注意ap1可以是一個函數。如果你想要的功能來訪問你的腳本的說法,與"[email protected]"調用它,即

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 

如果你的shell不支持>()(慶典和ksh和zsh的事,但它不是POSIX),但儘管如此,你的操作系統仍然支持/dev/fd(大多數unices都包括Solaris,Linux,* BSD,OSX和Cygwin),你可以使用顯式的fd混洗。

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

啊。這可能有效。有沒有辦法開球到FD的? ap1和ap2是具有管道和大量開關的巨大命令。如果我可以使用fd,它會更容易閱讀。 – User1 2010-08-26 18:44:27

+0

@ User1:它絕對有可能(並且在不支持'<()' and '>()'的shell中工作的優勢),但語法很尷尬。這裏將'ap1'和'ap2'定義爲函數會更簡單。 – Gilles 2010-08-26 19:43:25

+0

其他語法是什麼?我只注意到,我在腳本的某些部分使用if語句來修改如何根據輸入參數調用ap1。 '>()'在我的情況下可能不會奏效。但我不知道我還能怎麼稱呼它。有任何想法嗎?感謝您一直以來的幫助。 – User1 2010-08-26 19:51:42