检索TEE命令的底层文件 [英] Retrieve underlying file of tee command

查看:34
本文介绍了检索TEE命令的底层文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

参考资料

此处将讨论的内容的完整代码: https://github.com/djon2003/com.cyberinternauts.linux.backup

activateLogs解决的问题如何登录文件和屏幕https://stackoverflow.com/a/70792273/214898

限制

上一个问题的小提示:此脚本在有限的环境中QNAP(NAS)上执行。

背景

我有一个激活日志记录的功能,现在有三种模式:屏幕模式、磁盘模式和这两种模式。在一些帮助下(来自上面的链接问题),我实现了将工作作为两个选项。磁盘&;都使用编号为3的文件描述符。第一个文件描述符指向文件,第二个文件指向标准输出。

退出我的脚本(使用陷阱)时,它会检测是否有记录的错误并通过电子邮件发送。

代码

function sendErrorMailOnExit()
{
    ## If errors happened, then send email
    local isFileDescriptor3Exist=$(command 2>/dev/null >&3 && echo "Y")
    if [ "$isFileDescriptor3Exist" = "Y" ]; then
        local logFile=$(readlink /proc/self/fd/3 | sed s/.log$/.err/)
        local logFileSize=$(stat -c %s "$logFile")
        if [ $logFileSize -gt 0 ]; then
            addLog "N" "Sending error email"
            local logFileName=$(basename "$logFile")
            local logFileContent=$(cat "$logFile")
            sendMail "Y" "QNAP - Backup error" "Error happened on backup. See log file $logFileName

Log error file content:
$logFileContent"
        fi
    fi
}
trap sendErrorMailOnExit EXIT

问题

如您所见,这可以很好地工作,因为文件描述符#3使用的是文件。但是现在,使用Both选项,文件描述符#3指向stdout,文件通过tee写入。因此我的问题是,我如何才能获得tee的文件位置。

为什么不只使用来自我的函数的变量activateLogs,您会这么说吗?因为,此函数重新启动脚本,以便能够在调用函数之前获取未捕获的所有日志。因此,为什么使用此方法检索错误文件位置。

可能的解决方案,但不是最好的(我希望)

  1. 一种方法是通过脚本传递文件位置 参数,但如果可以避免,我不希望这样做。
  2. 另一种方法是创建始终指向该文件的文件描述符#4(可能是我目前最好的解决方案)(&QOOT;FAKE&QOOT;FASE&QOOT;)。

有人有主意吗?

推荐答案

我最终选择创建伪文件描述符#4,该描述符除了指向当前日志文件之外什么也不做。

这篇关于检索TEE命令的底层文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆