Giả sử tôi có đường ống sau:
a | b | c | d
Làm thế nào tôi có thể chờ đợi để hoàn thành c
(hoặc b
) trong sh
hoặc bash
? Điều này có nghĩa là tập lệnh d
có thể bắt đầu bất cứ lúc nào (và không cần phải chờ) nhưng yêu cầu đầu ra hoàn chỉnh c
để hoạt động chính xác.
Các trường hợp sử dụng là một difftool
cho git
rằng so sánh hình ảnh. Nó được gọi bởi git
và cần xử lý đầu vào của nó ( a | b | c
phần) và hiển thị kết quả so sánh ( d
phần). Người gọi sẽ xóa đầu vào được yêu cầu cho a
và b
. Điều này có nghĩa là trước khi trở về từ tập lệnh, quá trình c
(hoặc b
) phải chấm dứt. Mặt khác, tôi không thể chờ đợi d
vì điều này có nghĩa là tôi đang chờ người dùng nhập liệu.
Tôi biết rằng tôi có thể viết kết quả của c
một tệp tạm thời, hoặc có thể sử dụng một FIFO trong bash
. (Tuy nhiên, không chắc chắn nếu FIFO sẽ giúp đỡ.) Có thể đạt được điều này mà không cần các tệp tạm thời sh
không?
BIÊN TẬP
Có lẽ nó là đủ nếu tôi có thể tìm ra ID quy trình của quy trình c
(hoặc b
) một cách đáng tin cậy. Sau đó, toàn bộ đường ống có thể được bắt đầu không đồng bộ và tôi có thể đợi ID tiến trình. Một cái gì đó dọc theo dòng
wait $(a | b | { c & [print PID of c] ; } | d)
CHỈNH SỬA ^ 2
Tôi đã tìm thấy một giải pháp, ý kiến (hoặc vẫn là giải pháp tốt hơn) được chào đón.
d
có thể bắt đầu bất cứ khi nào nó thích, nhưng c
cần hoàn thành trước khi tôi có thể tiếp tục.
d
có thể bắt đầu khi nó thích, chính xác thì bạn đang chờ đợi điều gì?
d
không sử dụng đầu ra của c
thì có vẻ như không có ý nghĩa gì để tạo d
thành một phần của đường ống. Nhưng nếu d
không sử dụng đầu vào thì d
phải hoạt động một lúc trên đầu vào của nó sau khi đã đọc tất cả đầu vào để tiếp cận của bạn để tạo ra bất kỳ sự khác biệt.
d
bắt đầu xử lýc
đầu ra chỉ sau khic
đã hoàn thành? Bạn không muốnd
bắt đầu xử lý từng dòng đầu ra?