Sortie de commande pas dans stderr ni stdout

15

J'ai trébuché sur cette question, alors je me demande comment est-ce possible?

Exécution standard de la commande:

# 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, essayons d'obtenir la première ligne uniquement:

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

Et la tête standard?

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

Grep inverse? 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 à stdout?

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

Je suis vraiment perplexe ...

Jakov Sosic
la source
À quoi vous attendiez-vous tee? Que se passe-t-il si vous courez zabix_sender <options> 2>&1 | head -1?
terdon

Réponses:

15

Cela peut se produire si l'application écrit directement sur le TTY au lieu de STDOUT ou STDERR.

Vous pouvez jouer avec ce comportement en comparant les 2 exemples ci-dessous

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

Remarquez que le premier ne montre rien, mais le second. C'est parce que nous avons envoyé la sortie directement au tty et ignoré la redirection vers /dev/null.

Vous pouvez contourner ce genre de choses en utilisant script

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

Fondamentalement, l' scriptutilitaire crée un faux tty et lance la commande dans ce tty. Toute sortie de la commande est envoyée à STDOUT que vous pouvez ensuite rediriger normalement.

Patrick
la source
Merci pour le pointeur sur "script"! C'est exactement la chose dont j'avais besoin pour contourner l'insistance obstinée de gpg / gpg2 à ne pas lire depuis stdin.
Eric
Merci. Il a fallu pas mal de recherches pour arriver ici. Étonnant que ce soit une question si impopulaire (j'ai affaire à VLC).
Paul
script: illegal option -- c:( Y a-t-il d'autres solutions que vous connaissez?
Aaron