发送到日志并显示在控制台上

发送到日志并显示在控制台上

我这里有一个小测试脚本,它有错误处理。我希望所有 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

相关内容