【问题标题】:How to use debug trap without echoing trap command in fix command?如何在修复命令中使用调试陷阱而不回显陷阱命令?
【发布时间】:2012-09-11 06:27:44
【问题描述】:

我开始使用这个answer 在提示符中打印经过的命令时间。但是每当我进入修复模式时,也会回显陷阱命令。这是一个例子:

[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 陷阱,但没有遇到这个问题 - 它只是打印命令和结果:

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

但我不知道它是如何做到这一点的。如何在不为每个执行的命令回显timer_start 的情况下使用第一个示例?

【问题讨论】:

    标签: bash


    【解决方案1】:

    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]$ '
    

    【讨论】:

    • 那行不通。我认为 PS1 在您的示例中被分配一次,因此提示值始终相同:0s。
    • 它仍然对我不起作用(在版本 3.2.48 上),即使我对原因的猜测是错误的。它总是打印 0。
    • 我认为您甚至没有费心去测试这些建议,因为它们在现实世界中不起作用。前两个不适用于像 OP 中的示例这样的复合命令,如果您设置了 PROMPT_COMMAND,则最后一个不起作用。
    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多