我想打印最后一个 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