방법 : 무제한 Bash / shell 기록?


답변:


82

이것을 .bashrc(Linux) 또는 .bash_profile(MacOS)에 추가하십시오 .

export HISTFILESIZE=
export HISTSIZE=

거기에 무제한 역사. 현재 27000 개의 항목이 있습니다 :)

보낸 사람 man bash:

경우 HISTFILESIZE설정되지 않는 경우, 절단이 수행되지 않습니다.

즉, .bash_history절대로 잘리지 않습니다

HISTSIZE문서화 된 것을 찾을 수는 없지만에도 동일하게 적용됩니다 .

내가 시도 할 또 다른 깔끔한 기능은 다음과 같습니다.

경우 HISTTIMEFORMAT변수가 설정, 타임 스탬프는 역사의 주석 문자로 표시된 이력 파일에 기록됩니다, 그래서 그들은 다음과 같이 쉘 세션에 걸쳐 보존 할 수있다 :

export HISTTIMEFORMAT="%F %T "

이미 시도한 경우 알려주십시오 ...


3
이것은 실제로 많은 경우에 작동하지 않으며 bash 기록은 여전히 ​​잘립니다. 더 완벽한 해결책은 아래의 대답을 참조하십시오.
fotinakis

2
경고 : 이로 인해 두통이 발생합니다 gdb. HISTSIZE변수 를 설정하면 변수를 0으로 사용하여 기록 크기를 완전히 비활성화합니다.
Matteo Italia

2
참고 : 필요하지 않은 export, HISTFILESIZE라인 (안 바이트)의 수이며, 기록 파일 은 변수를 설정할 때 절단 단계가 발생 HISTFILESIZE (쉘 종료). 구성 파일에서 다른 값으로 두 번 설정하지 마십시오.
vaab

@vaab : HISTFILE을 내 보내지 않으면 내 histfile이 서브 쉘에서 "echo $ HISTFILE"을 사용하는 것을 볼 수 없으므로 필요하지는 않지만 도움이 될 수 있으며 감지 할 수있는 해를 끼치 지 않습니다.
Jeff Learman

41

( https://stackoverflow.com/a/19533853/128597 에서 답변을 다시 게시 )

수년에 걸쳐 많은 크고 추악한 반복과 이상한 일이 일어난 후에, 나는 이것을 .bashrc 의 간결한 섹션으로 만들었습니다 .

먼저 .bashrc의이 섹션을 주석 처리하거나 제거 해야합니다 (Ubuntu의 기본값). 그렇지 않으면 screen세션 실행과 같은 특정 환경에서 여전히 기록이 잘립니다.

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

둘째, 이것을 .bashrc의 맨 아래에 추가 하십시오 :

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

참고 : 모든 명령은 실행 직후에 기록되므로 실수로 암호를 붙여 넣은 경우 기록 기록을 피하기 위해 "kill -9 %%"만 할 수 없으므로 수동으로 제거해야합니다.

또한 각 bash 세션은 전체 히스토리 파일을 메모리에로드하지만 히스토리 파일이 10MB로 증가하더라도 ( 시간이 오래 걸리는 경우) bash 시작 시간에 큰 영향을 미치지 않습니다.


4
를 설정하면 기록 파일이 잘 리므로 HISTFILESIZE원하는 이벤트를 제외한 해당 이벤트를 제거해야합니다. 쉘 종료시 잘립니다 (그러나 예상됩니다). 그리고 당신은 필요하지 않습니다 export.
vaab

3
@vaab 내 보내지 않으면 bash --norc기록을 다시 자릅니다.
Yongwei Wu

1
export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"세션마다 셸 기록을 별도로 유지 하는 데 사용 합니다 (호스트 이름 및 tty 이름 기반). 물론 ~ / hist 디렉토리를 먼저 만들어야합니다.
Jeff Learman

2
PROMPT_COMMAND의 값을 확인하고 시스템에 미친 일을하기 때문에 맹목적으로 이것을 반복적으로 추가하지 않을 수도 있습니다. 널 검사 이상이지만 쉘 변수 확장 검색이 더 안전 할 것입니다.
dragon788 2016 년

3
나는 @ dragon788이 언급 한 문제를 피하기 위해 이것을 사용한다 :PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg

9

~ / .bashrc에 포함 :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

이 답변은 다음 기준을 만족합니다.

  1. 별도의 마스터 이력 (세션이 이력을 방해 할 수 없음)

  2. 자동 기록 작성 (핫키 없음)

  3. 드문 쓰기 (각 명령 뒤에 추가 없음)

배경

대화식 시작시 $HISTFILESIZE숫자로 설정된 경우 bash $HISTFILE는 해당 숫자로 잘립니다 . 대화식 닫기에서 쉘 옵션 histappend이 설정되면 bash는에 $HISTSIZE행을 추가 $HISTFILE하고 그렇지 않으면 겹쳐 씁니다 $HISTFILE.

OSX (터미널)에 대한 팁

터미널에서 탭을 만들 때마다 ~/.bash_profile읽습니다. 이는 bash가 계속 읽지 않습니다 ~/.bashrc. 에 다음 줄을 추가하십시오 ~/etc/bash_profile.

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

화면 팁

screen을 사용하는 경우 구성 파일은 ~ / .screenrc입니다. 화면에 기록을 기록하려면 bash 시작 파일을 제공하고 기록을 기록하는 로그인 쉘을 사용하도록 설정하면됩니다.

# use bash, make it a login shell
defshell -bash

3

다른 개념 (적용 할 수 없음)이지만 shell-sinkunlimited 사용시 히스토리 를 가질 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.