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

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.


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


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

1
Creo que te refieres/proc/self/fd/2
celtschk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.