Wyjście komendy nie w stderr ani stdout


16

Natknąłem się na ten problem, więc zastanawiam się, jak to możliwe?

Standardowy przebieg polecenia:

# 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, spróbujmy pobrać tylko pierwszą linię:

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

Co ze standardową głową?

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

Odwrotny grep? sed? trójnik?!?!?!!?

# 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 na stdout?

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

Jestem naprawdę zdziwiony ...


Czego się spodziewałeś tee? Co się stanie, jeśli uciekniesz zabix_sender <options> 2>&1 | head -1?
terdon

Odpowiedzi:


16

Może się to zdarzyć, jeśli aplikacja pisze bezpośrednio do TTY zamiast STDOUT lub STDERR.

Możesz grać z tym zachowaniem, porównując 2 poniższe przykłady

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

Zauważ, że pierwszy nic nie pokazuje, ale drugi tak. Jest tak, ponieważ wysłaliśmy dane wyjściowe bezpośrednio do tty i pominęliśmy przekierowanie do /dev/null.

Możesz obejść takie rzeczy za pomocą script

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

Zasadniczo scriptnarzędzie tworzy fałszywy tty i uruchamia polecenie w tym tty. Wszelkie dane wyjściowe polecenia są wysyłane do STDOUT, które można następnie przekierować jak zwykle.


Dziękujemy za wskaźnik do „skryptu”! Właśnie tego potrzebowałem, aby obejść uparty upór gpg / gpg2, aby nie czytać ze standardowego wejścia.
Eric

Dzięki. Dotarcie tutaj wymagało sporo poszukiwań. Zadziwiające, że to takie niepopularne pytanie (mam do czynienia z VLC).
Paul

script: illegal option -- c:( Czy są jakieś inne obejścia, o których wiesz?
Aaron
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.