2012-02-23 13 views
7

Tengo dos scripts de shell, uno que sirve como el "programa" principal y otro que sirve como "biblioteca".Escribir en el terminal después de redirigir la salida estándar a un archivo sin usar stderr?

En varios lugares del "programa", haré algo como: log "$thing" >> "$logfile", donde log es una función definida en la "biblioteca".

# program.sh 

logfile="log.txt" 
stuff="hahah heheh hoho" 

. library.sh 

for thing in $stuff; do 
    log "$thing" >> "$logfile" 
done 

Mi pregunta: ¿Hay una manera de reorientar algunos de la salida de la función de vuelta al terminal sin usando stderr?

# library.sh 

log() { 

    # This gets written to the log 
    echo "`date --rfc-3339=seconds`: $1" 

    # How to write this to the terminal *without* using stderr? 
    echo "Info: Message written to log." >&2 

} 

quiero evitar el uso de stderr porque en mi programa real, hay una opción para redirigir los errores a un archivo, pero los mensajes que desea enviar al terminal son informativas, no errores, y debe siempre aparecer en la terminal.

Respuesta

12

Abra /dev/tty en otro FD.

exec 0< /dev/null 
exec 1> /dev/null 
exec 2> /dev/null 
exec 3> /dev/tty 
echo 'Hello, World!' >&3 
+0

interesante ... ¿Puede usted explicar lo que está sucediendo ? ¿Cuál es el sentido de las primeras tres líneas? Parece que funciona bien solo con los dos últimos. Y, supongo que debería poner la cuarta línea en 'program.sh' en lugar de ejecutarla cada vez que se llame' log'. –

+1

Las primeras tres líneas demuestran que los descriptores originales ahora son inútiles. Es un sustituto fácil para un programa más complicado. – sarnold

+0

Los primeros tres son para mostrar que el script no tiene otra forma de hablar con el exterior (por ejemplo, están ocupados haciendo otras cosas). Colocaría la línea 'exec' en library.sh, pero le daría un número más alto (digamos, 8 o más) por si acaso. –

8

Puede escribir directamente a /dev/tty cada vez que desee escribir en el terminal:

echo "hello world" > /dev/tty 

Para un pequeño ejemplo:

$ cat writer.sh 
#!/bin/sh 

echo "standard output" 
echo "standard error" >&2 

echo "direct to terminal" > /dev/tty 
$ ./writer.sh > /tmp/out 2> /tmp/err 
direct to terminal 
$ cat /tmp/out 
standard output 
$ cat /tmp/err 
standard error 
$ 
+0

Gracias por esto. Quiero marcar ambos de forma correcta, pero debo darle este a Ignacio por la salsa especial 'exec' :) –

+0

La salsa especial 'exec' _es_ aseada. :) – sarnold

Cuestiones relacionadas