Tôi đã khám phá hầu hết tất cả các câu hỏi tương tự có sẵn , nhưng không có kết quả.
Hãy để tôi mô tả chi tiết vấn đề:
Tôi chạy một số tập lệnh không giám sát và chúng có thể tạo ra các dòng lỗi tiêu chuẩn và đầu ra tiêu chuẩn, tôi muốn nắm bắt chúng theo thứ tự chính xác như được hiển thị bởi trình giả lập thiết bị đầu cuối và sau đó thêm tiền tố như "STDERR:" và "STDOUT:" cho chúng.
Tôi đã thử sử dụng các đường ống và thậm chí là cách tiếp cận dựa trên epoll trên chúng, nhưng không có kết quả. Tôi nghĩ rằng giải pháp là trong việc sử dụng pty, mặc dù tôi không phải là bậc thầy về điều đó. Tôi cũng đã xem qua mã nguồn của Vome của Gnome , nhưng điều đó không mang lại nhiều hiệu quả.
Lý tưởng nhất là tôi sẽ sử dụng Go thay vì Bash để thực hiện điều này, nhưng tôi không thể làm được. Có vẻ như các đường ống tự động cấm giữ một trật tự dòng chính xác vì bộ đệm.
Có ai đó đã có thể làm một cái gì đó tương tự? Hay nó chỉ là không thể? Tôi nghĩ rằng nếu một trình giả lập thiết bị đầu cuối có thể làm điều đó, thì nó không - có thể bằng cách tạo một chương trình C nhỏ xử lý PTY (s) khác nhau?
Lý tưởng nhất là tôi sẽ sử dụng đầu vào không đồng bộ để đọc 2 luồng này (STDOUT và STDERR) và sau đó in lại chúng theo nhu cầu của tôi, nhưng thứ tự đầu vào là rất quan trọng!
LƯU Ý: Tôi biết về stderred nhưng nó không hoạt động với tôi với các tập lệnh Bash và không thể dễ dàng chỉnh sửa để thêm tiền tố (vì về cơ bản nó bao bọc rất nhiều tòa nhà).
Cập nhật: thêm vào dưới hai ý chính
- Ví dụ chương trình tạo ra thiết bị xuất chuẩn / stderr hỗn hợp
- Sản lượng dự kiến từ chương trình trên
(độ trễ ngẫu nhiên phụ thứ hai có thể được thêm vào trong tập lệnh mẫu tôi đã cung cấp để chứng minh một kết quả nhất quán)
Cập nhật: giải pháp cho câu hỏi này cũng sẽ giải quyết câu hỏi khác này , như @Gilles đã chỉ ra. Tuy nhiên tôi đã đi đến kết luận rằng không thể làm những gì được hỏi ở đây và đó. Khi sử dụng 2>&1
cả hai luồng được hợp nhất chính xác ở cấp độ pty / ống, nhưng để sử dụng các luồng riêng biệt và theo đúng thứ tự, người ta thực sự nên sử dụng cách tiếp cận của stderred mà involes s hookall hooking và có thể bị coi là bẩn theo nhiều cách.
Tôi sẽ háo hức cập nhật câu hỏi này nếu ai đó có thể không bảo vệ những điều trên.