bash의 역사는 어디에 저장됩니까?


95

을 실행하면 history최근에 실행 한 명령을 볼 수 있습니다.

내가하지만 tail -f $HISTFILEtail -f ~/.bash_history, 그들은이 나열되지 않습니다.

파일이 잠겼습니까, 임시 위치 나 비슷한 것이 있습니까?

답변:


117

Bash는 명령이 실행되는 동안 내부적으로 명령 목록을 메모리에 유지합니다. 그들은 .bash_history출구에 기록됩니다 :

대화식 쉘이 종료되면 마지막 $ HISTSIZE 행이 히스토리 목록에서 $ HISTFILE로 이름이 지정된 파일로 복사됩니다.

명령 기록을 강제로 작성하려면 다음 history -a명령을 사용할 수 있습니다 .

새 히스토리 라인 (현재 Bash 세션 시작 이후 입력 된 히스토리 라인)을 히스토리 파일에 추가하십시오.

-w옵션 도 있습니다 :

현재 히스토리를 히스토리 파일에 기록하십시오.

이력을 정확히 어떻게 사용하는지에 따라 더 적합 할 수 있습니다.

항상 즉시 작성되도록하려면 해당 명령을 PROMPT_COMMAND변수에 넣을 수 있습니다 .

export PROMPT_COMMAND='history -a'

참고 : .bash_history실수로 파일이 루트에 의해 소유되면 작업이 중지됩니다. 이 경우 소유권을 확인하고 sudo필요한 경우 소유권을 수정하는 데 사용하십시오.
토렉

13

(답변은 아니지만 의견을 추가 할 수 없습니다)

당신이 확인하는 경우 .bash_history당신은 단지 특정 명령을 삭제 원하기 때문에 (예를 들어 투명에 암호를 포함), 직접하여 메모리에서 항목을 삭제할 수 있습니다 history -d <entry_id>.

예를 들어 다음과 같은 출력을 가정하십시오.

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

그리고 당신은 export라인을 제거하기를 원한다면 , 당신은 단순히 다음을 통해 그것을 달성 할 수 있습니다 :

history -d 928

11

bash는 작업 메모리에 유지하며 bash는 각 명령이 닫히거나 각 명령 후에 저장하고 bash가 시작되거나 요청 될 때로드되도록 구성 할 수 있습니다.

각 명령 후에 저장하도록 구성한 경우 여러 개의 bash가 동시에 실행되는 의미를 고려하십시오. (명령 줄이 인터리브됩니다)


2
당신의 대답의 시작은 역사가 bash라는 파일이나 심지어 bashexetable에 저장된 것처럼 들립니다. " bash메모리에 저장되어 있습니다 ..."
Anthon

실제로 더 좋습니다
Anthon

5

세션이 활성화되어있는 동안 명령은 메모리 (RAM)에 저장됩니다. 쉘을 닫 자마자 .bash_history종료 하기 전에 명령 목록이 작성됩니다 .

따라서에 현재 세션의 기록이 표시되지 않습니다 .bash_history.


4
히스토리 파일은 bash종료시 업데이트 되므로 재부팅하지 않습니다 (특히 원하는대로 터미널을 열고 닫을 수있는 그래픽 환경에서).
John WH Smith

4

다음과 같은 경우 기록은 메모리 (기본적으로)에만 유지됩니다.

  • set -o history ( Hin echo "$-")가 설정됩니다.
  • HISTSIZE가 아닌 0
  • HISTIGNORE *(또는 다른 매우 제한적인 패턴) 는 아닙니다 .

위의 방법 중 하나라도 실패하면 메모리에 기록이 저장되지 않으므로 기록이 디스크에 기록되거나 기록되지 않습니다.

다음과 같은 경우 메모리의 기록이 디스크에 기록됩니다.

  • HISTFILESIZE가 0이
  • HISTFILE이 설정되지 않았습니다.

그러나 쉘이 종료되거나 명령 history -a(추가) 또는 history -w(쓰기)가 실행될 때만 가능합니다 .

디스크에 즉시 쓰기를 트리거하려면 변수를 사용할 수 있습니다.

 PROMPT_COMMAND='history -a'

하는 것입니다 기록 파일에 기록 라인. 이것들은 현재 bash 세션이 시작된 이후에 입력되었지만 아직 기록 파일에 추가되지 않은 기록 라인입니다.appendnew

또는:

 PROMPT_COMMAND='history -w'

하려면 덮어 메모리에서 목록과 HISTFILE에서 역사를.

따라서 메모리의 기록에서 명령을 제거 할 수 있습니다.

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

그리고 마지막 명령으로 디스크에 씁니다.

 history -w    # with `shopt -u histappend` unset

이것을 cron 작업에 넣어서 문제가 있습니까? 훨씬 적은 사용자 이름을 가진 많은 사용자가 특정 서버에 로그온하고 있으며 여전히 기록이 매우 작
으며이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.