Befehlsausgabe nicht in stderr oder stdout

15

Ich bin über dieses Problem gestolpert und frage mich, wie das möglich ist.

Standardmäßige Befehlsausführung:

# 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, versuchen wir nur die erste Zeile zu bekommen:

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

Was ist mit Standardkopf?

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

Inverse grep? sed? tee?!?!? !!?

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

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

Ich bin wirklich verwirrt ...

Jakov Sosic
quelle
Womit haben Sie gerechnet tee? Was passiert, wenn du rennst zabix_sender <options> 2>&1 | head -1?
Terdon

Antworten:

15

Dies kann passieren, wenn die Anwendung anstelle von STDOUT oder STDERR direkt in das TTY schreibt.

Sie können mit diesem Verhalten spielen, indem Sie die 2 folgenden Beispiele vergleichen

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

Beachten Sie, dass der erste nichts anzeigt, der zweite jedoch. Das liegt daran, dass wir die Ausgabe direkt an das tty gesendet und die Umleitung an umgangen haben /dev/null.

Mit können Sie solche Dinge umgehen script

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

Grundsätzlich erstellt das scriptDienstprogramm ein falsches tty und startet den Befehl in diesem tty. Jede Ausgabe des Befehls wird an STDOUT gesendet, das Sie dann wie gewohnt umleiten können.

Patrick
quelle
Vielen Dank für den Hinweis auf "Skript"! Das ist genau das, was ich brauchte, um das hartnäckige Bestehen von gpg / gpg2 zu umgehen, nicht von stdin zu lesen.
Eric
Vielen Dank. Ich habe ziemlich viel gesucht, um hierher zu kommen. Erstaunlich, dass es so eine unbeliebte Frage ist (ich habe es mit VLC zu tun).
Paul
script: illegal option -- c:( Gibt es andere Workarounds, die Sie kennen?
Aaron