web-dev-qa-db-fra.com

Comment rediriger STDERR et STDOUT vers différents fichiers et afficher également dans le terminal?

Je veux voir la sortie d'une commande dans le terminal comme s'il n'y avait pas de redirection. Aussi, Sterr doit être redirigé vers Err.Log et STDOUT doit être redirigé vers stdout.log.

Il serait agréable de disposer également de la copie exacte de ce qui est montré dans le terminal, c'est-à-dire des erreurs imprimées comme et lorsqu'elle se produit, dans un fichier séparé: stdouterr.log.

31
balki

Utilisez la commande tee comme suit:

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 Est-ce que vous échangez STDERR et STDOUT, car TEE ne peut accepter que stdout.

Jetez un coup d'œil à Commande Unix Tee Pour plus de redirections avancées à l'aide de tee.

39
dogbane

Je pense que la journalisation STDOUT et STDERR à deux fichiers différents sont une idée splendide. Ne fait-il pas que les journaux asynchrones? J'ai donc essayé ce qui suit:

  • stdout à "stdout.log" (comme suggéré Dogbane)
  • stardror à "stardr.log" (comme suggéré Dogbane)
  • toutes les sorties à "all.log" et
  • soyez toujours capable de voir la sortie à l'écran (dans un terminal séparé!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

dans un autre terminal

tail -f --sleep-interval=2 all.log
5
Sreeni

@dogbane, merci.
[.____] J'ai trouvé un autre moyen aussi qui évite les flux approximativement dans l'ordre, car ils seraient imprimés sans redirection.

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

Mais cela ne fonctionne qu'avec les coquilles qui soutient la substitution du processus.

3
balki