[英]Execute command after every command in bash
我想在我运行的每个 bash 命令之后打印日期。
这可以帮助我了解当我离开键盘时执行命令需要多少时间。
我知道我可以
`DATE=`date +%d/%m/%Y\ %H:%M:%S` && echo $DATE`
获取日期,但我不知道如何或什至可以在我在 bash 上执行的每个命令之后运行此命令。
我也有兴趣在每个命令之前运行相同的命令,这样我就可以知道一个命令需要多长时间。
是否可以?
我应该编辑什么文件?
例如:
$ wget google.com
15/07/2017 23:40:05
如果我还可以介绍以下功能,我会很高兴:
$ wget google.com
15/07/2017 23:40:05 15/07/2017 23:40:11
Program run for 00:00:06
第一个日期是我运行程序的日期,第二个是程序终止的日期,第三个是不言自明的。
如你所知,我不想每次都打字
$ wget google.com && `DATE=`date +%d/%m/%Y\ %H:%M:%S` && echo $DATE`
要在输入每个命令之前执行 cmd,请在 DEBUG 上设置陷阱。 例如。
trap date DEBUG
要在发出提示之前执行该命令,请设置 PROMPT_COMMAND:
PROMPT_COMMAND=date
这正是这样做的:
PROMPT_COMMAND+=$'\n'"date +%d/%m/%Y\ %H:%M:%S"
PROMPT_COMMAND 中的字符串在每个命令之后都会被评估。 您只需要将 date 命令添加到您已有的任何内容中。 ( $'\\n'
(换行符)是比;
更健壮的连接器;
因为两个连续的;
会给你一个语法错误)
您可以通过PS1
变量将日期/时间添加到提示中。 您可以使用date
命令,但使用受支持的特殊字符更有效,例如\\d
表示日期,或\\D{strftime-fmt}
。
例如:
PS1='\u@\h[\D{%F} \D{%T}]\w\$ '
或者,使用颜色:
PS1='\[\033[01;32m\]\u@\h\[\033[00m\][\[\033[02;33m\]\D{%F}\[\033[08m\]T\[\033[00m\]\[\033[02;33m\]\D{%T}\[\033[00m\]]\[\033[01;34m\]\w\[\033[00m\]\$ '
将会呈现:
user@host[2017-07-16 00:01:17]~/somedir$
请注意,在第二种情况(带颜色)中,我们有一个有效的 ISO8601 时间戳,中间有一个“隐藏的”日期/时间分隔符T
如果用鼠标选择它, T
是可见的并且可以被复制。 (同时双击将选择完整的时间戳,而不仅仅是日期或时间。)
要在每个命令后打印时间戳,只需修改您的 PS1 提示并向其添加日期。 这里唯一的问题是它会告诉您命令结束和显示新提示的时间。 因此,如果您的提示长时间处于打开状态,只需在运行命令之前按 Enter 键即可捕获开始时间。
PS1="\D{%F %T} \$ "
查看这个arch wiki 页面或只是谷歌 bash 提示定制。
要增加执行程序的时间,只需在命令前增加时间
$ time wget google.com
它会给你这样的输出
real 0m0.177s
user 0m0.156s
sys 0m0.020s
而且您可以变得更加懒惰,对于您不想每次运行时都输入时间的命令,只需创建别名即可。
alias wget="time wget"
因为在 bash 中别名在其他命令之前运行,即使它看起来像递归,你也可以这样做。 然后,您将按照习惯调用它。
当然,别名和提示设置可以放在您的 .bashrc 文件中,因此您不必每次打开终端时都输入它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.