Đầu ra của lệnh không trong stderr cũng như stdout


15

Tôi đã vấp phải vấn đề này, vì vậy tôi tự hỏi làm thế nào điều này có thể?

Chạy lệnh tiêu chuẩn:

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14
info from server: "Processed 0 Failed 1 Total 1 Seconds spent 0.000017"
sent: 1; skipped: 0; total: 1

OK, hãy thử chỉ lấy dòng đầu tiên:

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head -1
sent: 1; skipped: 0; total: 1

Đầu chuẩn thì sao?

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head 
sent: 1; skipped: 0; total: 1

Nghịch đảo grep? sed? tee?!?!? !!?

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | grep -v pero
sent: 1; skipped: 0; total: 1

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | sed 's/foo/bar/'
sent: 1; skipped: 0; total: 1

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | tee
sent: 1; skipped: 0; total: 1

stderr để stdout?

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 2>&1 | tee
sent: 1; skipped: 0; total: 1

Tôi thực sự bối rối ...


Bạn đang mong đợi điều teegì? Điều gì xảy ra nếu bạn chạy zabix_sender <options> 2>&1 | head -1?
terdon

Câu trả lời:


15

Điều này có thể xảy ra nếu ứng dụng đang ghi trực tiếp vào TTY thay vì STDOUT hoặc STDERR.

Bạn có thể chơi với hành vi này bằng cách so sánh 2 ví dụ dưới đây

( echo foo ) &>/dev/null
( echo foo > $(tty) ) &>/dev/null

Lưu ý cái đầu tiên không hiển thị bất cứ thứ gì, nhưng cái thứ hai thì không. Đó là bởi vì chúng tôi đã gửi đầu ra trực tiếp đến tty và bỏ qua chuyển hướng đến /dev/null.

Bạn có thể giải quyết những thứ như thế này bằng cách sử dụng script

script -c '( echo foo > $(tty) ) &>/dev/null'  >/dev/null

Về cơ bản scripttiện ích tạo ra một tty giả và khởi chạy lệnh trong tty đó. Bất kỳ đầu ra nào từ lệnh được gửi đến STDOUT mà sau đó bạn có thể chuyển hướng như bình thường.


Cảm ơn bạn đã con trỏ đến "kịch bản"! Đó chính xác là điều tôi cần để làm việc xung quanh sự khăng khăng bướng bỉnh của gpg / gpg2 về việc không đọc từ stdin.
Eric

Cảm ơn. Mất khá nhiều tìm kiếm để đến đây. Thật ngạc nhiên khi đó là một câu hỏi không phổ biến (Tôi đang xử lý VLC).
Paul

script: illegal option -- c:( Có cách giải quyết nào khác mà bạn biết không?
Aaron
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.