2010-08-26 25 views
6

Tôi muốn lấy stdout của một quá trình và phân tích nó với ba chương trình khác nhau. Tôi đã có thể sử dụng ống được đặt tên, nhưng tôi có thể sử dụng fd để thay thế.Làm thế nào để tee vào fd thay vì đặt tên ống

Dưới đây là những gì làm việc cho đến nay:

 

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

cat p1|ap1 & 
cat p2|ap2 & 
 

p1 và p2 được tạo ra với mkfifo. ap1 và ap2 là các chương trình phân tích. Tôi không biết nếu tôi nói điều này đúng, nhưng có một cách để tee thành hai fd mới thay thế? Một cái gì đó như thế này:

 

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

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

Trả lời

5

Bạn gần như đã có nó:

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

Lưu ý rằng ap1 có thể là một chức năng. Nếu bạn muốn các chức năng được tiếp cận với lập luận của kịch bản của bạn, gọi nó với "[email protected]", tức là,

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 

Nếu shell của bạn không hỗ trợ >() (bash, ksh và zsh làm, nhưng nó không phải POSIX), nhưng Tuy nhiên, hệ điều hành của bạn hỗ trợ /dev/fd (hầu hết các công việc liên quan, bao gồm Solaris, Linux, * BSD, OSX và Cygwin), bạn có thể sử dụng xáo trộn fd rõ ràng.

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

Ahh. Điều đó có thể hiệu quả. Có cách nào để tee để fd của mặc dù? ap1 và ap2 là các lệnh rất lớn với đường ống và tấn công tắc. Sẽ dễ đọc hơn nếu tôi có thể sử dụng fd. – User1

+0

@ User1: chắc chắn là có thể (và có lợi thế là làm việc trong các trình bao không hỗ trợ '<()' and '>()'), nhưng cú pháp là khó xử. Ở đây sẽ đơn giản hơn để định nghĩa 'ap1' và' ap2' làm hàm. – Gilles

+0

Cú pháp khác là gì? Tôi chỉ nhận thấy rằng tôi sử dụng nếu báo cáo trong một số phần của kịch bản mà sửa đổi cách ap1 được gọi là theo tham số đầu vào. '>()' có lẽ sẽ không hoạt động tốt trong trường hợp của tôi. Nhưng tôi không biết làm thế nào tôi có thể gọi nó. Bất kỳ ý tưởng? Cảm ơn vì sự giúp đỡ của bạn. – User1

Các vấn đề liên quan