Виведення команди не в 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?
тердон

Відповіді:


16

Це може статися, якщо додаток пише безпосередньо в 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, щоб не читати з stdin.
Ерік

Спасибі. Взяв зовсім небагато пошуків, щоб потрапити сюди. Дивно, що це таке непопулярне питання (я маю справу з VLC).
Павло

script: illegal option -- c:( Чи є ще якісь обхідні шляхи, які ви знаєте?
Аарон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.