tee stdout a stderr?

17

Me gustaría enviar stdout de un proceso al stdin de otro proceso, pero también a la consola. Enviar stdout a stdout + stderr, por ejemplo.

Por ejemplo, tengo un git editalias para lo siguiente:

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

Me gustaría que la lista de nombres de archivo se envíe tanto a la pantalla como a xargs.

Entonces, ¿hay una teeutilidad similar que haga esto? Para que pueda hacer algo como:

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

Respuestas:

14

tee puede duplicar a la consola actual usando tee /dev/tty

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

Alternativamente, puede usar /dev/stdouto /dev/stderrpero podrían redirigirse si su comando está dentro de un script. Tenga en cuenta que /dev/ttysiempre será la consola (y puede que no exista en un shell no interactivo). Esto está mal, lee los comentarios.

Vincent Robert
fuente
1
De hecho, en la canalización que muestra /dev/stdout se redirige. Es decir, si estuvieras usando tee /dev/stdoutel efecto sería que todo se envía xargsdos veces, y nada va al terminal.
celtschk
/dev/stdoutno se redirige por una tubería, se mantendrá la salida estándar del proceso actual. Sin embargo, si encapsula el comando en un script y luego redirige la salida estándar de este script, /dev/stdoutserá redirigido. En una consola interactiva, tee /dev/ttyy tee /dev/stdouttiene el mismo efecto, incluso cuando se utilizan tuberías.
Vincent Robert
Si no me crees, comienza tu caparazón y escribe echo foo | tee /dev/stdout | tr f by echo foo | tee /dev/tty | tr f b. Aquí hay una pista para usted: es la teeque interpreta el /dev/stdoutnombre del archivo.
celtschk
2
Tienes razón, no sé cómo me perdí eso. Hice algunas pruebas en mi propio shell con tty y stdout y de alguna manera me perdí eso. Gracias por la aclaración, eliminé la declaración incorrecta.
Vincent Robert
Bueno, dado que stderr no se ve afectado por la tubería, no habría sido necesario eliminar eso (por supuesto, la advertencia de redirección de script permanece, pero para un script, la redirección generalmente sería una propiedad deseada).
celtschk
4

Una solución más general que /dev/tty:

start cmd:> echo foo | tee /dev/stderr 
foo
foo
Hauke ​​Laging
fuente
start cmd:> es tu $PS1?
mgalgs
@mgalgs Parte de mi PS1, sí: hauke-laging.de/software/prompt (alemán)
Hauke ​​Laging
3

Puede usar el comando tee , solo aliméntelo con el archivo STDERR, como ejemplo:

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

entonces en ese caso tu alias quizás:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote
MolbOrg
fuente
1
Creo que te refieres/proc/self/fd/2
celtschk