和

我想打印最后一个 bash 命令及其时间戳。history 1显示历史命令本身。我需要在很多机器上使用它,所以它不应该依赖于任何自定义配置。我肯定缺少一些简单的命令来执行此操作,例如lastcmd或其他命令:)

请注意,它fc -l -1显示最后一个命令,但没有时间戳,而且太复杂,无论如何都无法频繁键入。

只是为了澄清,我正在寻找一些标准且简单的方法来执行此操作,因为我需要在许多服务器上使用它,并且自定义所有服务器或创建自定义函数是不可行的。另外我需要手动输入这个命令,所以它应该非常简单。

似乎 HISTCONTROL=ignoreboth 是我需要访问的服务器上的默认设置,因此我可以使用:

 history 1 

(历史命令以空格为前缀)不会将其放入历史记录中,因此它可以正确显示最后一个命令。

HISTTIMEFORMAT虽然默认情况下没有设置,所以它不是一个完整的解决方案。有没有更简单的方法?

答案1

正如您所指出的,history 1打印history命令本身,因为这是您运行的最后一个命令。要获得前一个,您需要history 2

$ touch foo
$ history 2
$ history 2
19950  touch foo
19951  history 2

因此,要获取上一个命令而不计算history其本身,请将其传递给head -n1

$ history 2 | head -n1
19952  touch foo

然后,以您想要的任何格式添加时间戳(请参阅man 3 strftime可用格式):

$ HISTTIMEFORMAT="%F %H:%M:%S " history 2 | head -n1
19959  2016-06-11 15:06:08 touch foo

(您可以使用也%T代替%H:%M:%S

答案2

一种可以提供帮助的非历史选项是自定义 shell 来显示它。我让它显示了这一点和其他信息(甚至是 git 分支!):

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

它本身对我的历史记录没有帮助,但当我在终端中向后滚动时,至少我可以看到:

$ vi .bashrc
17:57:09 durrantm Castle2012 /home/durrantm 
$ pwd
/home/durrantm
17:57:10 durrantm Castle2012 /home/durrantm 
$ ls *.lt*
ls: cannot access *.lt*: No such file or directory
17:57:15 durrantm Castle2012 /home/durrantm 
$ ls *.rb*
1.rb  2.rb  3.rb  3_step_minimal_foundation_spec.rb  arrival.rb  r.rb  validate_controller.rb  x.rb*
17:57:19 durrantm Castle2012 /home/durrantm 
$ c
17:57:24 durrantm Castle2012 /home/durrantm/Dropbox/_/work/code 
$ which ruby
/home/durrantm/.rvm/rubies/ruby-2.1.2/bin/ruby
17:57:27 durrantm Castle2012 /home/durrantm/Dropbox/_/work/code 

答案3

bash 似乎并没有提供任何简单的方法来获取执行最后一个命令时的时间戳。

如果您可以自定义服务器 bash 配置,您可以根据 @terdon 的答案创建自定义 bash 函数。

答案4

执行

export HISTTIMEFORMAT='%F %T '

你的历史文件将记录时间(仅适用于新命令):

$ history 5

99576  2016-06-13 02:26:25 export HISTTIMEFORMAT='%F %T '
99580  2016-06-13 02:26:45 bash -c 'IFS=:$IFS ; set -- a b c ; echo "$@ "'
99581  2016-06-13 02:27:37 dash -c 'set a b c; IFS=; echo $*'
99582  2016-06-13 02:28:25 fc -l -1
99607  2016-06-13 02:28:25 history 5

在命令之前使用空格以避免它被记录在历史记录中:

$  history 1
99607  2016-06-13 02:28:25 history 5

然后,为了更简单,创建一个别名:

$ alias h='history 1'

然后在设置完后加一个空格HISTTIMEFORMAT即可得到:

$  h                ### Understand that there is an space in front of the command.
99607  2016-06-13 02:28:25 history 5

相关内容