Déterminez si la sortie est stdout ou stderr

22

Comment puis-je déterminer si ce qu'un processus génère est stdout ou stderr?

Rauffle
la source

Réponses:

22

Je ne connais que trois façons de déterminer ce qu'un programme va sortir sur STDOUT et quoi sur STDERR

  1. Lisez la documentation. Ou

  2. Expérimentez avec la redirection †

  3. imprimer STDERR en rouge

†Par exemple:

program > program.stdout 2> program.stderr

Regardez ensuite les deux fichiers de sortie pour voir ce que le programme a écrit dans STDOUT et ce qu'il a écrit dans STDERR.

Au lieu de la redirection, vous pouvez diriger vers teesi vous avez besoin d'une sortie pour continuer à l'écran ainsi que dans un fichier. Voir /programming//q/692000/477035

RedGrittyBrick
la source
15
J'utilise généralement une variante de l'option 3: program | grep .imprime STDOUT en rouge.
Dennis
L'impression en rouge est à peu près exactement ce que je cherchais. Merci RedGrittyBrick & Dennis
Rauffle
7

Sur la base de votre demande commentée:

{ { command; } 2>&3 | sed 's/^/STDOUT: /'; } 3>&1 1>&2 | sed 's/^/STDERR: /'
zebediah49
la source
3
Semble impressionnant. Mais voudriez-vous ajouter les cerises à votre arbre et expliquer ce qu'il fait? Tout le monde ici n'est pas un gourou - et votre construction est assez complexe;)
Izzy
Les supports sont à commander. J'ai en fait obtenu cette forme exacte de I-oubliez-où, mais le point est d'utiliser des descripteurs de fichiers supplémentaires (au-delà de 1 = stdoutet 2 = stderr) pour prendre la sortie de l'ensemble interne de crochets, et exécuter stdoutune sedcommande, tout en stderrpassant par un autre.
zebediah49
Sensationnel. Je ne savais pas utiliser ces descripteurs supplémentaires. D'abord, j'étais un peu confus (j'aime comprendre ce que je cours - et je me suis un peu confondu avec les accolades). Mais maintenant, c'est clair - et à mon humble avis, exactement ce que le PO voulait. Donc +1 de ma part :)
Izzy
Cela m'a aidé. Je voulais ajouter plus de données dans stderr. Cela fait cela et renvoie correctement tout sur stdout / stderr. { { { { echo "stdout" ; echo "stderr">&2; } 2>&3; } 3>&1 1>&2 | awk '{print "ERROR:",$0}' 1>&3; } 3>&2 2>&1; }
Bryan Drewery
0

Vous pouvez simplement rediriger stderr vers un fichier et si quelque chose apparaît, c'est de stderr.

par exemple ls -a 2> ls-all.txt

s'il y a eu une erreur pour quelque raison que ce soit envoyée à stderr, elle sera redirigée vers ce fichier.

magna_nz
la source
-1

Si vous voulez le faire une fois, redirigez l'un d'entre eux ailleurs.

Exemple, rediriger la sortie standard avec >.

ls -al> ls-l.txt (toute sortie ici ne provient pas de stdout, si vous voyez quelque chose, il doit s'agir d'une sortie stderr)

Pour la redirection stderr 2>

Hennes
la source
Le processus crée un flux constant de sortie, certains pour stdout certains pour stderr. Je veux déterminer lequel est lequel, car cette sortie va à l'écran
Rauffle