用时间戳回显每个 shell 脚本命令

用时间戳回显每个 shell 脚本命令

set -x或者set -v打印每个执行的命令。

如何打印命令以及命令开始执行的时间?

答案1

在 Bash 中,可以使用内置命令“trap”和“DEBUG”级别来执行每个命令后的代码。

在 bash 中执行:help trap 或参考 bash 手册页,并查找 trap 部分

例子:

trap 'date' DEBUG

这将在每个命令之后执行命令“date”。

当然,您可以根据需要格式化时间戳,请参阅“日期”手册页。

如果您想删除换行符,以便时间戳出现在下一个命令的前面,您可以执行以下操作:

trap 'echo -n $(date)' DEBUG

终止此操作:

trap '' DEBUG

您可以与“set -x”/“set +x”结合使用

答案2

在 Bash 中,您可以使用PS4- 作为set -x跟踪输出的前缀。

PS4='+ $(date "+%s.%N")\011 '
set -x
...

\011 是水平制表符

答案3

无论如何,这并不是说这是一个完美的解决方案,但我认为它基本上满足了您的需求。只需将主脚本包装在一个函数中,并有一个单独的函数来调用时间。我相信这可以得到很大的改进,以获得确切的期望结果,但这是我想到的:

#!/bin/bash

tstamp() { date +[%T:%N]; }

yourscript() {
  set -x
  echo hello
  sleep 1
  echo this
  sleep 2
  echo is
  sleep 3
  echo an
  echo example
}

yourscript | while read line; do echo -e "$(tstamp)\t$line"; done

上述脚本输出以下内容:

+ echo hello
+ sleep 1
[16:17:33:344851100]    hello
+ echo this
+ sleep 2
[16:17:34:352269700]    this
+ echo is
+ sleep 3
[16:17:36:380810900]    is
+ echo an
+ echo example
[16:17:39:392033300]    an
[16:17:39:414361400]    example

相关内容