2012-09-11 50 views
0

我开始使用此answer在提示中输出经过的命令时间。但是每当我进入修复模式时,trap命令也会被回显。这里有一个例子:如何在修复命令中使用调试陷阱而不回显陷阱命令?

[last: 0s][~]$ sleep 2 && echo hello world 
hello world 
[last: 2s][~]$ fc 
sleep 2 && echo hello world 
timer_start 
timer_start 
hello world 

我发现this much more complicated prompt也使用DEBUG陷阱,但不会从此遭受problem-它只是打印命令和结果:

...$ sleep 2 && echo hello world 
hello world 
...$ fc 
sleep 2 && echo hello world 
hello world 

但我可以”弄清楚它是如何实现这一点的。我怎样才能使用第一个例子而不用为每个执行的命令回显timer_start

回答

2

set -vx显示start_timer在调用stop_timer(PROMPT_COMMMAND)时被调用,所以它被调用了太多次。

较短的解决方案:

trap 'timer=$SECONDS' DEBUG 
PS1='[last: $((SECONDS-timer))s][\w]$ ' 

,甚至更短的

trap 'SECONDS=0' DEBUG 
PS1='[last: ${SECONDS}s][\w]$ ' 

另一种解决方案:使用提示

trap 'date "+[%H:%M:%S]"' DEBUG 
PS1='[\t][\w]$ ' 
+0

这不工作的时间。我认为PS1在你的例子中被分配了一次,所以提示值总是相同的:0s。 – user1564022

+1

没有因为单引号被解释为每个命令 –

+0

它仍然不适用于我(在版本3.2.48),即使我对原因的猜测是错误的。它总是打印0。 – user1564022