看起来,如果我在具有不同日志文件的同一脚本中多次调用
exec > >(tee -a "${logFile}") 2>&1
,第一个日志文件将被附加多次。有没有办法在调用 exec > >(tee -a "${logFile}") 2>&1
之前重置 exec 调用?
$ cat sample.bash
#!/bin/bash -e
function redirectOutputToLogFile()
{
local -r logFile="${1}"
mkdir -p "$(dirname "${logFile}")"
exec > >(tee -a "${logFile}") 2>&1
}
function main()
{
redirectOutputToLogFile 'test1.log'
echo 'hello 1'
redirectOutputToLogFile 'test2.log'
echo 'hello 2'
redirectOutputToLogFile 'test3.log'
echo 'hello 3'
}
main "${@}"
$ ./sample.bash
hello 1
hello 2
hello 3
$ cat test1.log
hello 1
hello 2
hello 3
$ cat test2.log
hello 2
hello 3
$ cat test3.log
hello 3
您应该在一开始就备份原始描述符(stdout和stderr),然后在exec
重定向之前
恢复它们。
#!/bin/bash -e
# backup stdout/stderr in file descriptor 3 and 4 resp.
exec 3>&1 4>&2
function redirectOutputToLogFile()
{
local -r logFile="${1}"
mkdir -p "$(dirname "${logFile}")"
exec 1>&3 2>&4 # restore orig state of stdout/stderr
exec > >(tee -a "${logFile}") 2>&1
}