Nếu tôi hiểu đúng, bạn đang tìm kiếm tương đương tee file1 file2 file3
, nhưng thay vì ghi cùng một dữ liệu để ba tập tin file1
, file2
và file3
, bạn muốn ống cùng một dữ liệu vào ba lệnh cmd1
, cmd2
và cmd3
, tức là
… | ??? cmd1 cmd2 cmd3
nên tương đương với
… | cmd1 &
… | cmd2 &
… | cmd3 &
ngoại trừ điều đó …
sẽ chỉ được thực hiện một lần.
Có hai cách để làm điều đó.
Ksh93, bash và zsh hỗ trợ thay thế quá trình . Đây là một khái quát của các đường ống cho phép đối số của lệnh là một tệp mà khi được ghi vào sẽ truyền dữ liệu dưới dạng đầu vào cho lệnh (cũng có biến thể đầu vào, khi đọc từ đó, có được đầu ra dữ liệu bằng lệnh) . Đó là,
echo hello | tee >(cmd1)
in hello
ra đầu ra tiêu chuẩn và ngoài ra chạy cmd1
với hello
đầu vào.
Vì vậy, ví dụ, nếu bạn muốn sao chép đầu vào của somecommand
và chuyển nó cho cả hai cmd1
và cmd2
, bạn có thể sử dụng
somecommand | tee >(cmd1) | cmd2
Nếu vỏ của bạn không hỗ trợ thay thế quá trình, bạn có thể sử dụng đường ống có tên thay thế. Xem câu trả lời của Arcege để biết cách thức hoạt động. Các ống được đặt tên ít thuận tiện hơn so với thay thế quy trình vì bạn phải tạo và xóa chúng, đồng thời bắt đầu và đồng bộ hóa các quy trình theo cách thủ công. Chúng có lợi thế là hoàn toàn di động, trong khi không phải tất cả các vỏ đều hỗ trợ quá trình thay thế. Chúng cũng có thể được sử dụng trong các tình huống khác với quy trình thay thế.
Dưới mui xe, trên một số hệ thống, quy trình thay thế sử dụng các ống được đặt tên trong nội bộ. Tuy nhiên, trên hầu hết các hệ thống, nó phụ thuộc vào các tệp được đặt tên đại diện cho các mô tả tệp .