我在一个函数中运行一些命令。我想通过为该函数的每个命令输出添加日期和时间来记录它。但是,在终端中执行时,我只想显示主要的正常输出,而不显示任何日期或时间。
那么,我怎样才能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!
我希望有人可以改进。
我首先使用
ts
了这样的命令moreutils
。并且没有
ts
:在日志文件中:
在 tty 中: