Вывод команды не в stderr и не в стандартный вывод

15

Я наткнулся на эту проблему, поэтому мне интересно, как это возможно?

Стандартный прогон команды:

# 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? СЭД? тройник?!?!? !!?

# 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 в стандартный вывод?

# 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

Ответы:

15

Это может произойти, если приложение пишет непосредственно в TTY вместо STDOUT или STDERR.

Вы можете поиграть с этим поведением, сравнив 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, который затем можно перенаправить в обычном режиме.

Патрик
источник
Спасибо за указатель на «скрипт»! Это именно то, что мне нужно, чтобы обойти упорную настойчивость gpg / gpg2 не читать со стандартного ввода.
Эрик
Благодарю. Потребовалось немало поисков, чтобы добраться сюда. Удивительно, что это такой непопулярный вопрос (я имею дело с VLC).
Paul
script: illegal option -- c:( Есть ли какие-нибудь другие обходные пути, о которых вы знаете?
Аарон