即使 histappend 设置为 on,bash 也会覆盖历史记录

即使 histappend 设置为 on,bash 也会覆盖历史记录

我试图将 bash 历史记录写入文件 ( ...| 1 |...),然后更改环境变量...| 2 |...中的一个字符 ( )HISTTIMEFORMAT运行几个命令,并能够查看第一次运行的命令以及第二次运行的命令。

问题:

  1. 为什么当我更改值时,它会更改同一“列”中之前的所有值?
  2. 为什么shopt -s histappend没有区别?

操作系统:

[root@test ~]# cat /etc/*-release
CentOS release 6.10 (Final)
[root@test ~]# export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3
  872  Wed Jun 17 | 22:14:48 | 1 |export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3
  873  Wed Jun 17 | 22:14:50 | 1 |export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3
  874  Wed Jun 17 | 22:14:52 | 1 |export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3
[root@test ~]# export HISTTIMEFORMAT='%a %h %d | %T | 2 |'; shopt -s histappend; echo 2; history 3
  873  Wed Jun 17 | 22:14:50 | 2 |export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3
  874  Wed Jun 17 | 22:14:52 | 2 |export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3
  875  Wed Jun 17 | 22:15:02 | 2 |export HISTTIMEFORMAT='%a %h %d | %T | 2 |'; shopt -s histappend; echo 2; history 3

答案1

您没有查看文件中存储的内容。为此,您需要类似的东西:

tail -n 6 "$HISTFILE"

这将打印 6 行,对应于文件中存储的 3 个命令行。

$ export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3
   1
   15891  Wed Jun 17 | 20:18:27 | 1 |export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 5
   15892  Wed Jun 17 | 20:18:41 | 1 |export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 6
   15893  Wed Jun 17 | 20:18:44 | 1 |export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3

$ tail -n 6 "$HISTFILE"
   #1592439521
   export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 6
   #1592439524
   export HISTTIMEFORMAT='%a %h %d | %T | 1 |'; shopt -s histappend; echo 1; history 3
   #1592439630
   tail -n 6 "$HISTFILE"

假设历史文件在执行的每个命令上都会更新。

请注意,实际存储的每个命令之间有一个注释行。
该注释行实际上存储了执行每个命令时的 Unix 纪元(以秒为单位)。例如,该值:1592439630转换为通过 给出的格式TIMEFORMAT。这是转换为其他格式的简单数字。当您更改格式时,相同的数字将转换为不同的格式。因此,无法将某些数字转换为一种格式,而将另一些数字转换为其他格式。

设置histappend或不设置会影响完全不同的东西,而不是打印值的格式。它使每个命令(不带任何格式)附加到历史文件中,但仅当 shell 退出或history -w发出命令时才附加到历史文件中。简而言之,只有历史文件被写入。

相关内容