web-dev-qa-db-ja.com

ログに送信してコンソールに表示

ここに小さなテストスクリプトがあり、エラー処理があります。すべての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
eekfonky

coprocへの記述子リダイレクト を使用できます

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

... your script ...

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

2
Emmanuel

teeを使用します:

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

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

0
pfnuesel