2012-02-23 22 views
7

Ana "program" ve diğeri "kitaplık" işlevi gören bir tane olmak üzere iki kabuk betiğim var.Stdout'u stderr kullanmadan bir dosyaya yönlendirdikten sonra terminale yazılır mı?

"Program" daki birkaç yerde: log "$thing" >> "$logfile", "log" kütüphanesinde "tanımlanan bir işlevdir.

# program.sh 

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

. library.sh 

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

Sorum: stderr kullanarak olmadan geri terminale için işlevinden çıkış bazı yönlendirmek için bir yolu var mı?

# 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 

} 

çünkü benim asıl programda stderr kullanımını önlemek isteyen bir dosyaya yeniden yönlendirme hataları için bir seçenek, ama terminale göndermek istediğiniz mesajlar her zaman değil hataları, bilgilendirme, ve gerektiği Terminalde görün.

cevap

12

/dev/tty'u başka bir FD'de açın.

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

ilginç ... bitenden açıklayabilir ? Ayrıca ilk üç çizginin noktası nedir? Sadece son ikisi ile işe yarıyor gibi görünüyor. Ve, her zaman 'log' çağrıldığında yerine 'program.sh' dördüncü satır koymak gerektiğini varsayalım? –

+1

İlk üç satır, orijinal tanımlayıcıların artık işe yaramaz olduğunu gösteriyor. Daha karmaşık bir program için kolay bir stand-in. – sarnold

+0

İlk üçü, komut dosyasının dışarıdan konuşmanın başka bir yolunun olmadığını gösterir (ör. Başka şeyler yapmakla meşgul). 'Exec' satırını library.sh dizinine koyardım, ancak duruma göre daha yüksek bir sayı veririm (örneğin, 8 ya da öylesine). –

8
Sen /dev/tty doğrudan size terminale yazmak istediğiniz her zaman yazabilirsiniz

:

echo "hello world" > /dev/tty 

küçük Örneğin:

$ 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

Bunun için teşekkürler. Bunların her ikisini de doğru olarak işaretlemek istiyorum, ama bunu 'exec' özel sosu için Ignacio'ya vermeliyim :) –

+0

'exec' özel sos _is_ neat. :) – sarnold

İlgili konular