Shell 控制台中的打印错误以及错误和;日志文件中的输出-UNIX

Shell 控制台中的打印错误以及错误和;日志文件中的输出-UNIX,shell,unix,Shell,Unix,我有一个带有两个运行时参数的shell脚本。在执行过程中,如果出现任何错误,则需要将其重定向到错误文件并在控制台中执行。此外,错误和输出都需要重定向到日志文件 当前,错误输出被复制到err文件,并显示在控制台中。 但在日志文件中,输出和错误消息会被重定向两次 code #! /bin/sh errExit () { errMsg=`cat $1.log >> "$1".err` cat "$1".err | tee /dev/fd/3 retur

我有一个带有两个运行时参数的shell脚本。在执行过程中,如果出现任何错误,则需要将其重定向到错误文件并在控制台中执行。此外,错误和输出都需要重定向到日志文件

当前,错误输出被复制到err文件,并显示在控制台中。 但在日志文件中,输出和错误消息会被重定向两次

code

#! /bin/sh    
errExit ()
{
    errMsg=`cat $1.log >> "$1".err`
    cat "$1".err | tee /dev/fd/3    
   return
}

test()
{
logfile=$1
exec 3>&1 1>>"${logfile}".log 2>&1
echo "$1"
echo "$2"
echo " "
echo "#################################################"
echo "Hi Hello,This is first function"
echo "#################################################"
if [[ -z "$2" ]];
then 
errExit $logfile
return
else
#<some Commands Here>
fi
}

test_1()
{
logfile=$1
exec 3>&1 1>>"${logfile}".log 2>&1
echo "$1"
echo "$2"
echo " "
echo "#################################################"
echo "Hi Hello,This is second function"
echo "#################################################"
if [[ -z "$2" ]];
then 
errExit $logfile
return
else
#<some Commands Here>
fi
}
#/垃圾箱/垃圾箱
errExit()
{
errMsg=`cat$1.log>>“$1”。错误`
cat“$1”。错误| tee/dev/fd/3
返回
}
测试()
{
日志文件=$1
exec 3>&11>“${logfile}”.log 2>&1
回音“$1”
回音“$2”
回声“”
在现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方##############”
echo“你好,这是第一个函数”
在现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方##############”
如果[-z“$2”];
然后
errExit$logfile
返回
其他的
#
fi
}
测试_1()
{
日志文件=$1
exec 3>&11>“${logfile}”.log 2>&1
回音“$1”
回音“$2”
回声“”
在现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方##############”
echo“你好,这是第二个函数”
在现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方##############”
如果[-z“$2”];
然后
errExit$logfile
返回
其他的
#
fi
}

我不确定脚本中某些部分的用途,也不确定您希望记录的内容以及原因,但我将快速浏览一下

您当前的日志记录

当前的日志记录有点迂回。3点指向控制台,而1重定向到日志文件后2点指向1。如果发生错误,请将整个日志复制到错误文件中,然后使用tee发布整个错误文件。根据设计,tee打印到1(不是控制台)和您指定的任何文件,因此当您将错误文件(即整个日志)发布到1和3时,它会在控制台(3)中打印它,但也会将整个日志添加到日志中。基本上,你们已经把东西移动了,所以tee不再像预期的那样工作,变得无关紧要。此外,由于您正在使用exec更改管道,这些更改将持续整个脚本,可能会干扰输出

我的推荐

我建议您保留输出流的功能,以避免混淆。通过将日志添加到函数调用中,可以完全从函数中删除日志记录。因此,如果您的函数调用以前是
test log\u filename other\u arg
,则可以将其更改为
test other\u arg | tee log\u filename.log
。这会将所有内容发布到终端,但stdout也会被记录。你可能更喜欢

LOG=log_filename
test other_arg 2>&1 | tee "${LOG}.log"
这样日志就包含了stderr。这也将允许您的errExit函数只需满足以下条件:

errExit ()
{
    errMsg=`cp "${LOG}.log" "${LOG}.err"` # No useless cat calls ;)
    return
}
另一个好处是,由于
2>&1
重定向在函数调用中,脚本输出的其余部分将恢复为正常行为。虽然我没有发布它,但是您需要修改您的函数,使其不再期望或处理日志文件作为第一个参数

最简单的修复方法

如果您真的只想用最少的重构来修复代码,或者不想让内容总是打印到控制台,只需将errExit函数的第二行从
cat“$1”.err | tee/dev/fd/3
更改为
cat“$1”.err>&3


如果您提供反馈意见,我可以根据您的日志记录需求定制答案:)

我不确定您的脚本的某些部分的目的,也不确定您希望记录的内容以及原因,但我会快速浏览一下

您当前的日志记录

当前的日志记录有点迂回。3点指向控制台,而1重定向到日志文件后2点指向1。如果发生错误,请将整个日志复制到错误文件中,然后使用tee发布整个错误文件。根据设计,tee打印到1(不是控制台)和您指定的任何文件,因此当您将错误文件(即整个日志)发布到1和3时,它会在控制台(3)中打印它,但也会将整个日志添加到日志中。基本上,你们已经把东西移动了,所以tee不再像预期的那样工作,变得无关紧要。此外,由于您正在使用exec更改管道,这些更改将持续整个脚本,可能会干扰输出

我的推荐

我建议您保留输出流的功能,以避免混淆。通过将日志添加到函数调用中,可以完全从函数中删除日志记录。因此,如果您的函数调用以前是
test log\u filename other\u arg
,则可以将其更改为
test other\u arg | tee log\u filename.log
。这会将所有内容发布到终端,但stdout也会被记录。你可能更喜欢

LOG=log_filename
test other_arg 2>&1 | tee "${LOG}.log"
这样日志就包含了stderr。这也将允许您的errExit函数只需满足以下条件:

errExit ()
{
    errMsg=`cp "${LOG}.log" "${LOG}.err"` # No useless cat calls ;)
    return
}
另一个好处是,由于
2>&1
重定向在函数调用中,脚本输出的其余部分将恢复为正常行为。虽然我没有发布它,但是您需要修改您的函数,使其不再期望或处理日志文件作为第一个参数

最简单的修复方法

如果您真的只想用最少的重构来修复代码,或者不想让内容总是打印到控制台,只需将errExit函数的第二行从
cat“$1”.err | tee/dev/fd/3
更改为
cat“$1”.err>&3


如果您提供反馈意见,我可以根据您的日志记录需要定制答案:)

我尝试过上述方法,但没有成功。您能否澄清您尝试过我的方法的哪一部分以及哪些不起作用?我在一些脚本中使用过这种方法,因此如果它真的不起作用,可能还有其他问题。我尝试过上述方法,但没有成功。你能澄清一下你尝试过的方法的哪一部分以及什么不起作用吗?我在一些脚本中使用过这种方法,所以如果它真的不起作用,可能还有其他问题。