2017-04-06 15 views
0

ファイル記述子(例:stderr)をbashで再定義することはできますか?bashでstdout/stderrをどのように再定義できますか?

元のstderrstdoutをまだ使用できるうちに、すべての出力をデフォルトでファイルに送信したいと思います。

#!/bin/bash 
echo "Error: foo bar" 1>2 
REAL_STDERR=2 
REAL_STDOUT=1 
2=open("/tmp/stderr.log") 
1=open("/tmp/stdout.log") 
echo "This goes to stdout.log" 
if ! curl doesntexist.yet; then 
    echo "Error: Unable to reach host. See stderr.log for details" 1>REAL_STDERR 
fi 
+1

を余談として - 小文字の名前は、アプリケーションで使用するために予約されているのに対し、すべて大文字の名前は、オペレーティングシステムに意味を持つ変数に指定したか、自分自身をシェルしています。環境変数とシェル変数が名前空間を共有していることを覚えておいてください(既存の環境変数の名前と重複するシェル変数に割り当てることは、後者を上書きします)。http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html )ので、命名規則は必ず両方に適用されます。 –

+0

ありがとう、私はそれを知らなかった。 –

答えて

3

exec組み込みコマンドは、実行するコマンドの名前が指定されていない場合はこれを行います。

exec 3>&1 4>&2 2>/tmp/stderr.log >/tmp/stdout.log 

echo "This goes to stdout.log" 
echo "This goes to stderr.log" >&2 

echo "This goes directly to real stderr" >&4 

リダイレクトは、左から右のコマンドラインで指定された順序で処理されます。したがって、&1&2は、同じコマンドの以前のリダイレクトによって改変されたものとして解釈されます。

the relevant POSIX specを参照してください。


ファイル記述子に変数名を使用する場合(番号が自動的に割り当てられている場合)は、bash 4.1以上が必要です。そこに、あなたが行うことができます:

exec {real_stderr}>&2 {real_stdout}>&1 >stdout.log 2>stderr.log 
echo "This goes stdout.log" 
echo "This goes to stderr.log" >&2 
echo "This goes to real stderr" >&$real_stderr 
+0

古いstdout/stderrを保存することについてのビットを追加する必要があります。 – psmears

+0

@psmearsは適切に修正されました。ありがとうございました。 –

関連する問題