2012-02-23 2 views
7

Ho due script di shell, uno che funge da "programma" principale e un altro che funge da "libreria".Scrive sul terminale dopo aver reindirizzato lo stdout in un file senza utilizzare stderr?

In diversi punti del "programma", farò qualcosa tipo: log "$thing" >> "$logfile", dove log è una funzione definita nella "libreria".

# program.sh 

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

. library.sh 

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

La mia domanda: C'è un modo per reindirizzare alcuni dell'uscita dalla funzione di nuovo al terminale senza utilizzare 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 

} 

voglio evitare l'uso di stderr perché nel mio programma vero e proprio, c'è un'opzione per reindirizzare gli errori in un file, ma i messaggi che voglio inviare al terminale sono informativo, non gli errori, e deve sempre presentarsi sul terminale.

risposta

12

Aprire /dev/tty su un altro FD.

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

interessante ... ci può spiegare cosa sta succedendo ? Inoltre, qual è il punto delle prime tre linee? Sembra funzionare bene solo con gli ultimi due. E, suppongo che dovrei mettere la quarta riga in 'program.sh' piuttosto che eseguirla ogni volta che viene chiamato' log'? –

+1

Le prime tre righe dimostrano solo che i descrittori originali sono ora inutili. È un facile supporto per un programma più complicato. – sarnold

+0

I primi tre mostrano che lo script non ha altro modo di parlare all'esterno (ad es. Sono occupati a fare altre cose). Metterei la riga 'exec' in library.sh, ma dargli un numero più alto (ad esempio, 8 o giù di lì) per ogni evenienza. –

8

È possibile scrivere direttamente a /dev/tty ogni volta che si desidera scrivere sul terminale:

echo "hello world" > /dev/tty 

Per un piccolo esempio:

$ 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

Grazie per questo. Voglio contrassegnare entrambi questi dati corretti, ma devo dare questo a Ignacio per la salsa speciale "exec" :) –

+0

La salsa speciale "exec" _is_ neat. :) – sarnold