stderr 또는 stdout에없는 명령 출력


16

나는이 문제를 우연히 발견 했으므로 어떻게 이것이 가능한지 궁금합니다.

표준 명령 실행 :

# 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

역병? 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

stderr to stdout?

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

정말 의아해


무엇을 기대 tee했습니까? 당신이 실행하면 어떻게됩니까 zabix_sender <options> 2>&1 | head -1?
terdon

답변:


16

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

아래 두 가지 예를 비교하여이 동작을 수행 할 수 있습니다.

( 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으로 전송되며 이는 정상적으로 재 지정 될 수 있습니다.


"스크립트"에 대한 포인터 감사합니다! 그것은 정확히 stdin에서 읽지 않는 것에 대한 gpg / gpg2의 완고한 주장을 해결하기 위해 필요한 것입니다.
Eric

감사. 여기에 도착하기 위해 많은 노력을 기울였습니다. 그것이 인기가없는 질문이라는 사실에 놀랍습니다 (VLC를 다루고 있습니다).
Paul

script: illegal option -- c:( 다른 해결 방법이 있습니까?
Aaron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.