我正在尝试从执行工具的 bash 函数中保存一些日志(其中一些在子 shell 中运行)。此外,我想将所有错误打印到终端。
我的代码在点击 ctr-c 和一个奇怪的日志文件时会导致一个 sigpipe 和退出代码 141。管道失败似乎是由陷阱内的 stdout 重定向到 stderr 引起的,这会破坏 tee 命令的 stdout 流。有趣的是,代码按预期终止,退出代码 130 没有在陷阱或cat
命令中使用重定向。
我仍然无法修复和解释生成的日志文件。为什么有两次回声,为什么陷阱回声也写入文件?
为什么函数内的重定向不是更早引起的信号管道?
trap '
echo trap_stdout
echo trap_stderr >&2
' INT
fun(){
echo fun_stdout
echo fun_stderr >&2
( sleep 10 | cat )
}
echo > log
fun >> log 2> >(tee -a log)
日志文件
fun_stdout
fun_stderr
fun_stderr
trap_stdout
编辑:根据oguz ismail回答的工作示例
exec 3>> log
exec 4> >(tee -ai log >&2)
fun 2>&4 >&3
exec 3>&-
exec 4>&-