用于记录日期和时间的 stderr stdout 也显示输出到 tty,但没有日期和时间

用于记录日期和时间的 stderr stdout 也显示输出到 tty,但没有日期和时间

我正在函数中运行一些命令。我想通过为该函数的每个命令输出添加日期和时间来记录它。但是,在执行时的终端中,我只想显示主要的正常输出,而不显示任何日期或时间。

那么,我如何exec 3>&1 1>>${log} 2>&1通过adddate像这样的函数来管道所有这些

./script | adddate >>$log这样我就可以date在每一行获取日志输出,但同时我可以在终端上显示输出。

我不想在 tty 中显示日期和时间,我只想将它们保存在日志中。我这样做是因为我想捕获用户在任何特定时间可能传递的所有无效参数等等,但同时,我想向在 tty 执行脚本的用户显示输出。

到目前为止,我已经做到了如下:

#!/usr/bin/env bash
log=logs.txt
exec 3>&1 1>>${log} 2>&1 ## works but without date

然后我尝试了如下所示的东西。不太清楚如何正确执行它

3>$1 1>> | adddate ${log} 2>&1 ###(!) doesnt work
exec 3>&1 | adddate 1>> ${log} 2>&1 ###(!) doesnt work

adddatemain函数如下所示:

adddate() {
    while IFS= read -r line; do
        printf "%s %s\n" "$(date)" "$line";
    done
}

main()
{

case $arg in
        --version)
                [[ "$arg2" == "" ]] && { --version; } || { error; } ;;

        build)
                [[ "$arg2" == "oneshot"  ]] && {
                        build oneshot; } || {
                        build;
                         } ;;
        update)
                [[ "$arg2" == "" ]] && { update; } || { error; } ;;
        *)
                error
esac

}

arg=$1;
arg2=$2;
shift;

main | tee /dev/fd/3; ## so that it goes to tty, not sure if there is other better way?!?

main因此,简而言之:日志应该类似于以下内容:对于每个命令,在类似函数的命令输出之前,应该在日志中写入日期和时间

main()
{
   printf "Hello\n";
   printf "there!\n";
}

注销应该是:

Mon Jun 17 20:00:02 JST 2019 Hello
Mon Jun 17 20:00:02 JST 2019 there!

和 tty 不应该显示日志而只显示主要输出,例如:

Hello
there!

答案1

我希望有人能改进。

我首先使用这样的ts命令。moreutils

#!/usr/bin/env bash

command -v ts > /dev/null 2>&1 [[ $? -ne 0 ]] && { sudo apt install moreutils -y; };

log="./testlog.txt"
comm()
{
        printf "Hi\n";
        echo "here is a wrong command"
        csdf;
        echo "bye"
}

exec 3>&1 1>>${log} 2>&1;
comm | tee /dev/fd/3 | ts;

并且没有ts

#!/usr/bin/env bash

log="./testlog.txt"
comm()
{
        printf "Hi\n";
        echo "here is a wrong command"
        csdf;
        echo "bye"
}
dddate() 
{
while IFS= read -r line; do
        printf '%s %s\n' "$(date)" "$line"
done
}

exec 3>&1 1>>${log} 2>&1;
comm | tee /dev/fd/3 | dddate;

在日志文件中:

./test.sh: line 10: csdf: command not found
Mon Jul  8 12:23:44 UTC 2019 Hi,
Mon Jul  8 12:23:44 UTC 2019 here is a wrong command
Mon Jul  8 12:23:44 UTC 2019 thanks

在终端中:

Hi,
here is a wrong command
thanks

相关内容