ログに送信され、コンソールに表示される

ログに送信され、コンソールに表示される

ここにエラー処理機能を備えた小さなテストスクリプトがあります。すべてのSTDERRとSTDOUTがコンソール(現在)に表示され、ログファイルとして作成されることを望みます。

#!/bin/bash

# error handling
function error_handler() {
  echo "Error occurred in script at line: ${1}."
  echo "Line exited with status: ${2}"
}

trap 'error_handler ${LINENO} $?' ERR

set -o errexit
set -o errtrace
set -o nounset

if rsync -aPh ~/Downloads/Temps-linux-x64.zip .; then
        echo "SUCCESSFULL rsync of files"
else
        echo "FAILED rsync of files"
fi

最初に追加してキャプチャしてみました。

exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1

ただし、これは(必要に応じて)すべてを記録しますが、コンソールには出力がありません。また、エラー処理が正しく機能しなくなるため、他の回避策が必要です。

答え1

あなたはそれを使用することができますcoprocにリダイレクトされた記述子

#!/bin/bash 
exec 3<&1
coproc mytee { tee log.out >&3;  }
exec >&${mytee[1]} 2>&1

... your script ...

STDOUT と STDERR はスクリプト出力にマージされます。誰かがログファイルでマージし、出力から切り離す方法を見つけたらいいでしょう。

答え2

使用tee:

./script 2>&1 | tee log.out

tee上記の例では、標準入力と指定されたファイルをコピーしますlog.out。詳細についてはを参照してくださいman tee

関連情報