Bash

即使將 histappend 設置為 on,bash 也會覆蓋歷史記錄

  • June 18, 2020

我正在嘗試將 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

您沒有查看文件中儲存的內容。為此,您需要以下內容:

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發出命令時。簡而言之,只有在寫入歷史文件時。

引用自:https://unix.stackexchange.com/questions/593540