2012-02-23 7 views
7

Mam dwa skrypty powłoki, jeden, który służy jako główny "program", a drugi służy jako "biblioteka".Zapis do terminalu po przekierowaniu stdout do pliku bez użycia stderr?

W kilku miejscach w "programie" zrobię coś takiego: log "$thing" >> "$logfile", gdzie log jest funkcją zdefiniowaną w "bibliotece".

# program.sh 

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

. library.sh 

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

Moje pytanie: Czy istnieje sposób aby przekierować trochę wyjścia z funkcji z powrotem do terminalu bez użyciu 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 

} 

chcę uniknąć używania stderr bo w moim aktualnego programu, nie ma opcji, aby przekierować błędów do pliku, ale wiadomości chcę wysłać do terminalu są informacyjnych, a nie błędy i powinien zawsze pojawi się na terminalu.

Odpowiedz

12

Otwórz /dev/tty na innym FD.

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

ciekawe ... może Pan wyjaśnić, co się dzieje ? Jaki jest sens pierwszych trzech linii? Wygląda na to, że działa dobrze tylko z dwoma ostatnimi. I, przypuszczam, powinienem umieścić czwartą linię w 'program.sh' zamiast wykonywać ją za każdym razem, gdy wywoływany jest' log'? –

+1

Pierwsze trzy linie pokazują, że oryginalne deskryptory są teraz bezużyteczne. Jest to łatwe do opanowania dla bardziej skomplikowanego programu. – sarnold

+0

Pierwsze trzy to pokazanie, że skrypt nie ma żadnego innego sposobu mówienia na zewnątrz (np. Jest zajęty robieniem innych rzeczy). Wstawiłbym wiersz 'exec' w bibliotece.sh, ale na wszelki wypadek nadaj mu większą liczbę (powiedzmy 8 lub więcej). –

8

Możesz napisać bezpośrednio do /dev/tty każdym razem, gdy chcesz napisać do terminala:

echo "hello world" > /dev/tty 

dla małego przykład:

$ 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

Dzięki za to. Chcę zaznaczyć oba te poprawne, ale muszę dać to Ignacio dla specjalnego sosu "exec" :) –

+0

Specjalny sos "exec" _is_ schludny. :) – sarnold