我在终端中运行的大多数事情都需要很长时间来计算,我希望 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+ )。L
clear
- 可能还有其他几个。
我想一个好的折衷方案是通过 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 的评论,切换-e
到read
.
答案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 不会移动光标。