bash는 histappend가 on으로 설정되어 있어도 기록을 덮어씁니다.

bash는 histappend가 on으로 설정되어 있어도 기록을 덮어씁니다.

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"

그러면 파일에 저장된 3개의 명령줄에 해당하는 6개의 줄이 인쇄됩니다.

$ 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여부는 인쇄된 값의 형식과 완전히 다른 영향을 미칩니다. 이는 각 명령(형식 없음)을 기록 파일에 추가하지만 셸이 종료되거나 history -w명령이 실행될 때만 가능합니다. 즉, 히스토리 파일만 기록됩니다.

관련 정보