STDOUT输出被写入自定义文件描述符

时间:2015-08-11 14:41:58

标签: bash shell

我有一个函数可以将文件描述符打开到fd 3,重定向到文件。我遇到的问题是来自其他函数的STDOUT被写入fd3正在写入的文件。所以代码如下所示。

我不明白start_report函数中的打开文件描述符3如何允许从日志或写入STDOUT的任何其他函数输出到/tmp/testfile.log。奇怪的是,并非所有STDOUT都写入fd 3,只有一些。

start_report () {
exec 3>/tmp/testfile.log

cat <<EOF >&3
Some text is written to a report.
EOF
}

report_update () {
cat <<EOF >&3
some more text is written to a report.
EOF
}

end_report () {
cat <<EOF >&3
some ending text is written to a report.
EOF
exec 3>&-
}

log () {
#$1 = function name
#$2 = log message
echo "$1" "$2"
}

main () {
start_report
log "${FUNCNAME[0]}" "Starting main"
update_report
log "${FUNCNAME[0]}" "updating report"
end_report
}

main

1 个答案:

答案 0 :(得分:4)

声明

exec 3> /tmp/testfile.log

在执行语句的shell中的文件描述符3上打开/tmp/testfile.log。即使它发生在函数内部,它也会影响执行函数的shell;即,它没有作用于功能的主体。当前shell执行start_report后,文件描述符3将保持附加到/tmp/testfile.log,直到它被关闭或重新分配。

但是,

log不会写入文件描述符3;它只写入标准输出(文件描述符1)。其他函数将其命令的标准输出重定向到文件描述符3。