【问题标题】:Execute command after every command in bash在bash中的每个命令之后执行命令
【发布时间】:2017-12-20 17:44:41
【问题描述】:

我想在运行每个 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`

【问题讨论】:

  • 也许这对你有帮助https://unix.stackexchange.com/q/12059
  • 您还可以在PS1 提示符中包含日期,以便在运行每个命令之前和之后始终显示在您面前。您可以使用\D{format},其中格式传递给strftime(3)。很方便。还有多种时间格式可供选择。

标签: linux bash shell ubuntu command-line


【解决方案1】:

要在输入每个命令之前执行 cmd,请在 DEBUG 上设置陷阱。例如。

trap date DEBUG

要在发出提示之前执行该命令,请设置 PROMPT_COMMAND:

PROMPT_COMMAND=date

【讨论】:

  • 这很酷,但陷阱似乎在命令执行之前运行。
  • 正是我想要的。每次默认打开终端时,如何使 PROMPT_COMMAND=date 执行?因为您的解决方案有效,但是当我打开终端时我只需要输入一次...我怎样才能消除...ONCE :) 我很懒!确实感谢
  • @f126ck 你把它放到你的 .bashrc 文件中。
【解决方案2】:

这正是这样做的:

PROMPT_COMMAND+=$'\n'"date +%d/%m/%Y\ %H:%M:%S"

PROMPT_COMMAND 中的字符串会在每个命令后进行评估。您只需要将 date 命令添加到您已经拥有的任何内容中。 ($'\n'(换行符)比; 更健壮,因为两个连续的; 会给你一个语法错误)

【讨论】:

    【解决方案3】:

    您可以通过PS1 变量在提示中添加日期/时间。您可以使用date 命令,但使用supported special characters 更有效,例如\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 是可见的并且可以被复制。 (同样双击会选择完整的时间戳,而不仅仅是日期或时间。)

    【讨论】:

      【解决方案4】:

      要在每个命令后打印时间戳,只需修改您的 PS1 提示并添加日期即可。这里唯一的问题是它会告诉你命令结束和新提示显示的时间。因此,如果您长时间打开提示符,只需在运行命令之前按回车键即可捕获开始时间。

      PS1="\D{%F %T} \$ "
      

      查看此arch wiki page 或只是 google bash 提示自定义。

      要添加执行程序所花费的时间,只需在命令前添加时间

      $ time wget google.com
      

      它会给你这样的输出

      real 0m0.177s
      user 0m0.156s
      sys 0m0.020s
      

      而且你可以变得更加懒惰,对于你不想在每次运行时输入 time 的命令,只需创建别名。

      alias wget="time wget"
      

      因为在 bash 中别名是在其他命令之前运行的,所以即使看起来像递归,您也可以这样做。然后你会按照你习惯的方式调用它。
      当然,别名和提示设置可以放在你的 .bashrc 文件中,这样你就不必每次打开终端时都输入它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        • 1970-01-01
        相关资源
        最近更新 更多