我正在函数中运行一些命令。我想通过为该函数的每个命令输出添加日期和时间来记录它。但是,在执行时的终端中,我只想显示主要的正常输出,而不显示任何日期或时间。
那么,我如何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
adddate
,main
函数如下所示:
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