多次调用 exec >>(tee -a "${logFile}") 2>&1 使用不同的日志文件

问题描述 投票:0回答:1

看起来,如果我在具有不同日志文件的同一脚本中多次调用

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
bash shell sh exec tee
1个回答
0
投票

您应该在一开始就备份原始描述符(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
}
© www.soinside.com 2019 - 2024. All rights reserved.