如何报告所有 bash 命令的时间和其他信息?

如何报告所有 bash 命令的时间和其他信息?

我在终端中运行的大多数事情都需要很长时间来计算,我希望 bash 在结束时输出一个时间报告每一个命令输入到终端。我可以在 bashrc 中添加一些内容来执行此操作吗?

例子:

$ find / -ls
<find / -ls return info>
start time = 10:21:54 | end time = 10:31:34 | time lapsed = 00:10:20
$

或者

$ make all
<make all return info>
start time = 10:21:54 | end time = 10:31:34 | time lapsed = 00:10:20

如果能够为 cd 之类的命令添加例外列表,那就太好了,但这并不会真正困扰我。

答案1

我在我的中尝试了以下操作.bashrc

echo -ne "$PS1"
while IFS= read -er line;do
    eval "time $line"
    echo -ne "$PS1"
done

这大致可以满足您的要求,但有几个注意事项:

  • 您的提示符实际上已被破坏(shell 通常会\W在回显提示符之前解释提示符中的类似序列)。
  • 您将失去命令行编辑功能(例如,您不能使用CTRL+ )。Lclear
  • 可能还有其他几个。

我想一个好的折衷方案是通过 shell 函数有选择地启用此功能:

timed_commands() {
    [ "$1" = off ] && exec bash
    PS1='$ '  # Put something simple here
    while IFS= read -erp "$PS1" line;do
        eval "time $line"
    done
}

打开它timed_commands并使用关闭它timed_commands off

感谢 @jthill 的评论,切换-eread.

答案2

现在这简直太糟糕了,但它可能会起作用......

将终端 id 字符串(查询返回的字符串)设置为“time”。注意尾随空格。接下来设置您的提示以询问结束。现在,每次显示提示符时,终端都会自动为您键入时间和空格,然后您键入命令。这不适用于所有终端,因为许多终端已禁用此功能以防止这种情况发生。

要使其与 xterm 一起使用,请将以下行添加到您的 .Xresources 并使用 xrdb 重新加载它

xterm*answerbackString: time ^[0D^[0A
URxvt*answerbackString: time ^[0D^[0A
xterm_color*answerbackString: time ^[0D^[0A

其中 ^[ 是转义符(因为 xterm 不喜欢在answerbackString 末尾有空格,所以我摆动光标。

接下来将 ENQ 添加到提示字符串的末尾(bash 特定示例):

PS1="${PS1}\[\005\]"

在新的 xterm 中启动一个新的 shell,祈祷它应该可以工作。 \005 是一个 ENQ,[ 和 ] 告诉 bash \005 不会移动光标。

相关内容