Tee không nhận được toàn bộ đầu ra từ đường ống


10

Tôi có một tập lệnh thực thi các lệnh như:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

Vấn đề có lẽ là trong đường ống đến tee. Nó dường như không nhận được toàn bộ đầu ra. Khi ứng dụng thoát khỏi vài dòng cuối cùng của đầu ra (thường là những dòng có lỗi nghiêm trọng) sẽ bị thiếu. Khi tôi chạy ứng dụng mà không có đường ống, teetôi sẽ đưa chúng vào đầu ra.

Làm cách nào tôi có thể buộc tập lệnh chờ tee hoàn thành xử lý tất cả đầu ra?


Nó có hoạt động tốt không nếu bạn phát nó vào một tập tin, không phải thiết bị xuất chuẩn?
Phi công6

Câu trả lời:


21

Lỗi nghiêm trọng có thể xuất hiện trong STDERR (2), không phải STDOUT (1). Bạn có thể chuyển hướng STDERR thành STDOUT 2>&1và sau đó đường ống cũng sẽ nắm bắt nó.

./some_app -i $INDEX 2>&1 | tee $LOG

Nếu bạn có vấn đề về bộ đệm trên đầu, bạn có thể buộc nó vào trạng thái không có bộ đệm:

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG

Tốt, chúng tôi đang tiến gần hơn. Bây giờ tôi thấy rằng lỗi nghiêm trọng đang được in nhưng một lần nữa nó không hoàn thành. Dòng có lỗi chỉ kết thúc ở giữa và đầu ra echo tiếp tục. Vẫn còn một số vấn đề với bộ đệm xả hoặc đơn giản là chờ phần đó hoàn thành.
Ladislav Mrnka

Đã chỉnh sửa. Khá hiếm khi theo kinh nghiệm của tôi rằng một cái gì đó hoàn toàn trượt qua bộ đệm khi thoát nhưng nó đáng để đi.
Oli

1
Làm xong! Cảm ơn bạn. Tôi có thể hỏi quá nhiều câu hỏi nhưng có ai hiểu tại sao tôi cần tắt bộ đệm khi chuyển sang quy trình khác không?
Ladislav Mrnka

@Oli Một cái rất tốt!
Pilot6

6

Vì các thông báo lỗi thường được hiển thị trên STDERR (Mô tả tệp 2), bạn cần chuyển hướng cả STDOUT và STDERR sang tee:

./some_app -i "$INDEX" |& tee "$LOG"

Khi bạn làm, ./some_app -i $INDEX | tee $LOGbạn chỉ chuyển hướng STDOUT đến tee.

|& sẽ khiến cả STDOUT và STDERR được chuyển hướng.

Nếu bạn không thể chuyển hướng chỉ STDOUT (Như bạn đã):

./some_app -i "$INDEX" | tee "$LOG"

Mặt khác, nếu bạn muốn chuyển hướng chỉ STDERR:

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.