繁体   English   中英

在bash中的每个命令之后执行命令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM