Câu trả lời chung là không. Bạn có thể prog2thoát ra trước prog1cả khi bắt đầu (rõ ràng điều đó không thể xảy ra nếu prog2thực sự đọc một số thông tin đầu vào, điều mà bạn mong đợi nó sẽ làm nếu bạn đang sử dụng nó trong một đường ống). Nó chắc chắn có thể prog2thoát ra trước đó prog1; điều này xảy ra ví dụ khi prog2một chương trình tìm kiếm thoát ngay khi tìm thấy kết quả khớp, trong trường hợp đó prog1có thể chưa hoàn thành việc tạo ra tất cả dữ liệu.
Không có cách trực tiếp prog2để lấy trạng thái thoát prog1hoặc thậm chí để biết rằng prog1đã thoát. Tất cả những gì prog2có thể biết là prog1đã đóng đầu ống của nó, điều mà nó có thể làm mà không chết.
Nếu bạn muốn có được trạng thái thoát prog1khỏi prog2, có hai phương thức phổ biến: bạn có thể ghi nó vào một tệp hoặc bạn có thể gửi nó qua đường ống. Gửi trạng thái đầu ra là dòng cuối cùng của dữ liệu đường ống là một khả năng. Bạn phải đảm bảo không xử lý dòng cuối cùng cho đến khi bạn biết rằng đó là dòng cuối cùng, tức là cho đến khi bạn cố đọc dòng tiếp theo.
{ prog1; echo $?; } | …
Dưới đây là một ví dụ trong đó phía bên phải là một bộ lọc văn bản tô màu cho mỗi dòng có chứa từ lỗi Lỗi lỗi màu đỏ. Nếu phía bên trái không thành công, phía bên phải thoát ra với cùng trạng thái.
{ prog1; echo $?; } | awk '
NR != 1 {
if (line ~ /[Ee][Rr][Rr][Oo][Rr]/) print "\033[31m" line "\033[0m";
else print line;
}
{line = $0}
END {exit($0)}
'