1. ホーム
  2. bash

[解決済み] ログファイルやコンソールへの出力の書き出し

2022-11-04 23:01:18

質問

Unixシェルで、環境ファイル( env ファイルは、ログファイル名やパス、ログファイルへの出力やエラーのリダイレクト、データベース接続の詳細など、ユーザースクリプトの実行に必要なパラメータを定義しています。 ) があり、すべての出力 ( echo メッセージ ) とエラーは、以下のコードを使って実行されたスクリプトからログファイルにリダイレクトされます。

exec 1>>${LOG_FILE}
exec 2>>${LOG_FILE}

env ファイルは各スクリプトの最初に実行されます。envファイル内の上記のコードにより、ユーザー出力やエラーなどのすべてのコンソール出力は、私が実際に必要としていたログファイルに直接出力されるようになりました。

しかし、コンソールとログファイルの両方に表示させたい選択的なユーザー出力がいくつかあります。しかし、上記のコードのため、私はそれを行うことができません。

上記のコードを削除すれば、このケースで望ましい結果を得られることは分かっていますが、他のすべての出力をログ ファイルに手動で書き込む必要があり、これは簡単なタスクではありません。

上記のコードを削除せずに、コンソールとログファイルの両方で出力を得る方法はありますか。

どのように解決するのですか?

exec 3>&1 1>>${LOG_FILE} 2>&1

は stdout と stderr の出力をログファイルに送りますが、fd 3 をコンソールに接続したままにしておくことで、次のようなことができます。

echo "Some console message" 1>&3

を使えばコンソールにだけメッセージを書くことができますし

echo "Some console and log file message" | tee /dev/fd/3

にメッセージを書き込む。 ともに コンソール ログファイル tee はその出力を自分自身の fd 1 (ここでは LOG_FILE ) と、書き込むように指示したファイル (ここでは fd 3, すなわちコンソール) の両方に出力を送ります。

例を示します。

exec 3>&1 1>>${LOG_FILE} 2>&1

echo "This is stdout"
echo "This is stderr" 1>&2
echo "This is the console (fd 3)" 1>&3
echo "This is both the log and the console" | tee /dev/fd/3

と表示されます。

This is the console (fd 3)
This is both the log and the console

をコンソール上に表示し

This is stdout
This is stderr
This is both the log and the console

をログファイルに書き出します。