2012-02-23 3 views
7

私は2つのシェルスクリプトを持っています.1つはメインの "プログラム"として機能し、もう1つは "ライブラリ"として機能します。stderrを使わずにstdoutをファイルにリダイレクトした後に端末に書き込む?

「プログラム」内のいくつかの場所では、log "$thing" >> "$logfile"のようになります。logは、「ライブラリ」で定義されている関数です。

# program.sh 

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

. library.sh 

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

私の質問:stderrを使用してせずに戻って、端末に関数からの出力の一部をリダイレクトする方法はありますか?

私はいつも私の実際のプログラムでは、エラーは、存在しないファイルにエラーをリダイレクトするためのオプションがありますが、私は、端末に送信するメッセージは情報であるため、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 

} 

端末に表示されます。

答えて

12

/dev/ttyを別のFDに開きます。

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

を...あなたは何が起こっているかを説明することができます?また、最初の3行のポイントは何ですか?最後の2つでうまくいくようです。そして、 'log'が呼び出されるたびに' program.sh'を実行するのではなく、 'program.sh'に4行目を入れるべきでしょうか? –

+1

最初の3行は、元のディスクリプタが現在役に立たないことを示しています。これは、より複雑なプログラムのための簡単なスタンドインです。 – sarnold

+0

最初の3つは、スクリプトが外部に話す他の方法を持っていないことを示しています(たとえば、他のことをやっているなど)。私はlibrary.shに 'exec'行を置きますが、その場合に備えてより高い数字(例えば、8程度)を与えます。 –

8

あなたは/dev/ttyに直接あなたが端末に書き込みをするたびに書き込むことができます。小さな例えば

echo "hello world" > /dev/tty 

興味深い
$ 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

ありがとうございます。私はこれらの両方を正しいものにしたいと思いますが、私はIgnacioに 'exec'特別ソースのためにこれを与えなければなりません:) –

+0

' exec'特別ソース_is_ neat。 :) – sarnold

関連する問題