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
Roger Lipscombe
la source

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.

Vincent Robert
la source
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
4

Une solution plus générale que /dev/tty:

start cmd:> echo foo | tee /dev/stderr 
foo
foo
Hauke ​​Laging
la source
start cmd:> est votre $PS1?
mgalgs
@mgalgs Une partie de mon PS1, oui: hauke-laging.de/software/prompt (allemand)
Hauke ​​Laging
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
MolbOrg
la source
1
Je pense que tu veux dire/proc/self/fd/2
celtschk