Câu trả lời chung là không. Bạn có thể prog2
thoát ra trước prog1
cả khi bắt đầu (rõ ràng điều đó không thể xảy ra nếu prog2
thự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ể prog2
thoát ra trước đó prog1
; điều này xảy ra ví dụ khi prog2
mộ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 đó prog1
có 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 prog1
hoặc thậm chí để biết rằng prog1
đã thoát. Tất cả những gì prog2
có 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 prog1
khỏ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)}
'