2009-03-22 15 views
31

Esta me ha estado molestando por un tiempo. ¿Es posible redirigir stdout y stderr a la salida del terminal y a un programa?Redirigir bash stdout/stderr a dos lugares?

entiendo que es posible redirigir las salidas a un archivo y a stdout con tee, pero yo quiero que vaya a un programa (mi editor [TextMate]), así como a la salida del terminal ... sin duda esto es posible (Sé que es posible con zsh ...)

+0

ver también http://stackoverflow.com/a/60955/1295595 – craq

Respuesta

31

Se puede utilizar una tubería con nombre, que está destinado a exactamente la situación que usted describe.

mkfifo some_pipe 
command_that_writes_to_stdout | tee some_pipe \ 
    & command_that_reads_from_stdin < some_pipe 
rm some_pipe 

O, en Bash:

command_that_writes_to_stdout | tee >(command_that_reads_from_stdin) 
+3

La sustitución de procesos de Bash lo hará por usted en un solo paso (tipo de una "tubería con nombre anónimo") command_that_writes_to_stdout | tee> (command_that_reads_from_stdin) – oylenshpeegul

+0

@ephemient, gracias! – JasonSmith

+1

Eso es solo stdout no stderr. – Nils

18

¿Es posible redirigir stdout y stderr tanto a la salida del terminal como a un programa?

No estoy seguro de lo útil que es combinar stdout y stderr en la entrada de un editor, pero ¿hace esto lo que usted necesita?

input_prog 2>&1 | tee /dev/tty | my_editor 
+0

Charles, es que "T>/dev/tty" correcta? Nunca lo he visto hecho de esa manera. Normalmente solo "tee/dev/tty" para obtener el efecto que buscas. – paxdiablo

+0

@Pax @Charles Bailey corrigió error tipográfico. Rollback if tee> fue intencionado – phihag

+0

Doh, sí, lo siento. Obviamente stdout no puede ser redirigido y canalizado al mismo tiempo. Gracias. –

2

Realmente no sé si TextMate puede tomar un archivo para editar como su entrada estándar, eso parece un poco extraño. Sospecho que usted quiere conectar la salida/stderr a un archivo y editarlo allí, en cuyo caso se necesita:

progname 2>&1 | tee tempfile ; textmate tempfile 

El 2>&1 redirige stderr (identificador de archivo 2) para ir al mismo lugar que stdout (manejador de archivo 1) para que ambos terminen en una sola secuencia. El comando tee luego lo escribe en tempfile y stdout.

Luego, una vez que el proceso ha terminado, se llama al editor en el archivo temporal.

Si se puede aceptar la entrada estándar para la edición, use:

progname 2>&1 | tee /dev/tty | textmate 
+0

Pipetear cualquier cosa para aparearse y se abrirá en un nuevo documento – obeattie

Cuestiones relacionadas