检索TEE命令的底层文件 [英] Retrieve underlying file of tee command
本文介绍了检索TEE命令的底层文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
参考资料
此处将讨论的内容的完整代码: https://github.com/djon2003/com.cyberinternauts.linux.backupactivateLogs
解决的问题如何登录文件和屏幕: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
,您会这么说吗?因为,此函数重新启动脚本,以便能够在调用函数之前获取未捕获的所有日志。因此,为什么使用此方法检索错误文件位置。
可能的解决方案,但不是最好的(我希望)
- 一种方法是通过脚本传递文件位置 参数,但如果可以避免,我不希望这样做。
- 另一种方法是创建始终指向该文件的文件描述符#4(可能是我目前最好的解决方案)(&QOOT;FAKE&QOOT;FASE&QOOT;)。
有人有主意吗?
推荐答案
我最终选择创建伪文件描述符#4,该描述符除了指向当前日志文件之外什么也不做。
这篇关于检索TEE命令的底层文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文