명령의 출력이 stderr 또는 stdout에 없습니다.

명령의 출력이 stderr 또는 stdout에 없습니다.

이 질문을 우연히 발견했는데 이것이 어떻게 가능한지 궁금합니다.

표준 실행 명령:

# 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

좋습니다. 첫 번째 행만 가져오도록 하겠습니다.

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

표준 헤드는 어떻습니까?

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

역방향 grep? sed? 티? ! ? ! ? ! ! ?

# 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

표준 출력에 대한 표준 오류?

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

정말 혼란스러워요 ...

답변1

이는 애플리케이션이 STDOUT 또는 STDERR 대신 TTY에 직접 쓰는 경우 발생할 수 있습니다.

아래 2가지 예를 비교하여 이 동작을 시도해 볼 수 있습니다.

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

첫 번째 항목에는 아무 것도 표시되지 않지만 두 번째 항목에는 아무것도 표시되지 않습니다. 이는 출력을 tty로 직접 보내고 /dev/null.

다음을 사용하여 이와 같은 문제를 해결할 수 있습니다.script

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

기본적으로 이 script유틸리티는 가짜 tty를 생성하고 해당 tty에서 명령을 시작합니다. 명령의 모든 출력은 STDOUT으로 전송되며, 그런 다음 정상적으로 리디렉션할 수 있습니다.

관련 정보