![用时间戳回显每个 shell 脚本命令](https://linux22.com/image/659241/%E7%94%A8%E6%97%B6%E9%97%B4%E6%88%B3%E5%9B%9E%E6%98%BE%E6%AF%8F%E4%B8%AA%20shell%20%E8%84%9A%E6%9C%AC%E5%91%BD%E4%BB%A4.png)
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