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 shhoặc bash? Điều này có nghĩa là tập lệnh dcó 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 difftoolcho gitrằng so sánh hình ảnh. Nó được gọi bởi gitvà cần xử lý đầu vào của nó ( a | b | cphần) và hiển thị kết quả so sánh ( dphần). Người gọi sẽ xóa đầu vào được yêu cầu cho avà 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 dvì đ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 cmộ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 shkhô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.
dcó thể bắt đầu bất cứ khi nào nó thích, nhưng ccần hoàn thành trước khi tôi có thể tiếp tục.
dcó thể bắt đầu khi nó thích, chính xác thì bạn đang chờ đợi điều gì?
dkhông sử dụng đầu ra của cthì có vẻ như không có ý nghĩa gì để tạo dthành một phần của đường ống. Nhưng nếu dkhông sử dụng đầu vào thì dphả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.
dbắt đầu xử lýcđầu ra chỉ sau khicđã hoàn thành? Bạn không muốndbắt đầu xử lý từng dòng đầu ra?