Linux 如何为每个命令向bash脚本日志添加时间戳并排除set、echo和log?

Linux 如何为每个命令向bash脚本日志添加时间戳并排除set、echo和log?,linux,bash,logging,Linux,Bash,Logging,如何为每个命令(排除set、echo、log)向bash脚本日志添加时间戳 我正在运行备份脚本,希望使用时间戳记录所有命令: #./svnbackup.sh 2&>1 | timestamp_xtrace > ./svn-backup.log 2>&1 这是我的函数,它不起作用: timestamp_xtrace() { while IFS= read -r line; do if [[ "$line" =~ "^+ set" ]] &am

如何为每个命令(排除set、echo、log)向bash脚本日志添加时间戳

我正在运行备份脚本,希望使用时间戳记录所有命令:

 #./svnbackup.sh 2&>1 | timestamp_xtrace > ./svn-backup.log 2>&1
这是我的函数,它不起作用:

 timestamp_xtrace() {
   while IFS= read -r line; do
     if [[ "$line" =~ "^+ set" ]] && [[ "$line" =~ "^+ echo" ]] && [[ "$line" =~ "^+ log" ]]; then
         echo "$(date) $line";
     fi
   done
 }
我想排除一些命令(set、echo、log…),但它不起作用。。
有人有什么提示可以解决我的问题吗?

这个bash函数应该可以:

timestamp_xtrace() { 
   while IFS= read -r line; do
      [[ "$line" =~ ^[[:blank:]]*(set|echo|log) ]] && echo "$(date):: $line"
   done
}
^[:blank:][]*(set | echo | log)
将匹配
set
echo
log
行首的空格或制表符

测试:

cat << EOF | timestamp_xtrace
foo bar
log something testing
echo and more
abc xyz
EOF
Tue Sep 29 10:40:44 EDT 2015:: log something testing
Tue Sep 29 10:40:44 EDT 2015:: echo and more

我找到了一个有效的解决方案:

timestamp_xtrace() {
   while IFS= read -r line; do
     if [[ "$line" != "+ set"* ]] && [[ "$line" != "+ echo"* ]] && [[ "$line" != "+ log"* ]]; then
       echo "$(date) $line";
     fi
   done
}
我将正则表达式(
=~“^”+echo”
)更改为(
!=“+echo”*
)以便测试与正确的行匹配:

# cat << EOF | timestamp_xtrace
+ somecmd
+ echo "hello world!"
hello world!
+ svnadmin -args
EOF

那些
&
s不应该是
|
s吗?我建议使用
logger
。我想记录所有行,但行以“set”或“echo”或“log”开头。是的,但OP的函数也在stdout上打印它。
Wed Sep 30 09:12:43 CEST 2015 + somecmd
Wed Sep 30 09:12:43 CEST 2015 hello world!
Wed Sep 30 09:12:43 CEST 2015 + svnadmin -args