tee stdout à stderr?


17

Je voudrais envoyer stdout d'un processus à la stdin d'un autre processus, mais aussi à la console. Envoi de stdout à stdout + stderr, par exemple.

Par exemple, j'ai un git editalias pour les éléments suivants:

git status --short | cut -b4- | xargs gvim --remote

J'aimerais que la liste des noms de fichiers soit également envoyée à l'écran xargs.

Alors, existe-t-il un teeutilitaire similaire à cela? Pour que je puisse faire quelque chose comme:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

Réponses:


14

tee peut être dupliqué sur la console actuelle en utilisant tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

Alternativement, vous pouvez utiliser /dev/stdoutou /dev/stderrmais ils pourraient être redirigés si votre commande se trouve dans un script. Notez que ce /dev/ttysera toujours la console (et peut ne pas exister dans un shell non interactif). C'est faux, lisez les commentaires.


1
En effet, dans le pipeline que vous montrez /dev/stdout est redirigé. Autrement dit, si vous utilisiez tee /dev/stdoutl'effet serait que tout est envoyé à xargsdeux fois, et rien ne va au terminal.
celtschk

/dev/stdoutn'est pas redirigé par un tube, il restera la sortie standard du processus en cours. Cependant, si vous encapsulez la commande dans un script, puis redirigez la sortie standard de ce script, vous /dev/stdoutserez redirigé. Dans une console interactive, tee /dev/ttyet tee /dev/stdouta le même effet, même lorsque vous utilisez des tuyaux.
Vincent Robert

Si vous ne me croyez pas, lancez votre shell et tapez echo foo | tee /dev/stdout | tr f bet echo foo | tee /dev/tty | tr f b. Voici un indice pour vous: il teeinterprète le /dev/stdoutnom de fichier as.
celtschk

2
Tu as raison, je ne sais pas comment j'ai raté ça. J'ai fait quelques tests dans ma propre coquille avec tty et stdout et je l'ai raté d'une manière ou d'une autre. Merci pour la clarification, j'ai supprimé la mauvaise déclaration.
Vincent Robert

Eh bien, étant donné que stderr n'est pas affecté par le canal, vous n'auriez pas eu besoin de supprimer cela (bien sûr, la mise en garde de la redirection de script reste, mais pour un script, la redirection serait généralement une propriété souhaitée).
celtschk


3

Vous pouvez utiliser la commande tee , il suffit de l'alimenter avec le fichier STDERR, par exemple:

tee /dev/stderr
tee /proc/self/fd/2

dans ce cas, votre alias peut être:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

1
Je pense que tu veux dire/proc/self/fd/2
celtschk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.