我有一个函数可以将文件描述符打开到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
答案 0 :(得分:4)
声明
exec 3> /tmp/testfile.log
在执行语句的shell中的文件描述符3上打开/tmp/testfile.log
。即使它发生在函数内部,它也会影响执行函数的shell;即,它没有作用于功能的主体。当前shell执行start_report
后,文件描述符3将保持附加到/tmp/testfile.log
,直到它被关闭或重新分配。
log
不会写入文件描述符3;它只写入标准输出(文件描述符1)。其他函数将其命令的标准输出重定向到文件描述符3。