.bash_history에 즉시 쓸 수 있습니까?


124

나는 종종 열려 많은 및 단자의 많은 [지금 내가 가진 7이 작업 공간에 열려]와 나는 종종 검색 historygrep내가 최근에 작성한 명령을 찾을 수 있지만, 내가 터미널을 사냥하고 싶지 않아 다음 스크롤 때때로 '종료'없이 터미널이 닫히고 내가 쓴 모든 내용이 손실되는 경우가 있습니다. [때로는 내가 죽인 터미널에 쓴 것이 필요했습니다.]

각 터미널이 .bash_history에 즉시 쓰도록 만드는 방법이 있습니까? 최소한 1 분에 한 번 정도 요?


2
일반적으로 control-r하나의 bash 명령 기록에서 리버스 검색에 사용 합니다. history | grep정규식이 필요하지 않은 한보 다 편리합니다 .
Peter Cordes

답변:


92

실시간 Bash History 업데이트에 설명 된 간단한 솔루션 입니다.

해당 명령을 .bashrc 구성에 넣으라고합니다.

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

첫 번째 명령 .history은 추가 할 파일 모드를 변경합니다 . 두 번째 history -a는 각 쉘 프롬프트에서 명령이 실행되도록 구성 합니다. 는 -a즉시 기록 파일에 현재 / 새로운 라인을 기록합니다.

zsh 관련 :


1
잘 이런 종류의 작품. 나는 더 많은 테스트를 시도했으며 첫 번째 명령에서만 작동하는 것 같습니다. 제대로 작동합니까?
Matt

54

이것을 당신의 것으로 넣으십시오 .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

여기에 크레딧 : https : //.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -c실행중인 세션의 기록을 지 웁니다. 이렇게하면 기록 카운터의 양이 줄어 듭니다 $HISTSIZE. history -r내용을 읽고 $HISTFILE현재 실행중인 세션 기록에 삽입하십시오. 그러면의 행 수가 기록 카운터를 증가시킵니다 $HISTFILE.

나는 명령을 거의 즉시 사용할 수 있음을 의미한다고 생각합니다 (하나의 터미널, write echo 1, 두 번째 터미널 echo 2을 먼저 사용 echo 3하고 아래쪽 화살표를 두 번 누르면 echo 2사용 가능해야 함). 주어진 터미널에서 명령을 실행하여 쓰여졌다.


훌륭한! 감사. 이러한 옵션이 문서화되지 않은 이유가 궁금합니다 man history.
artfulrobot

10
@artfulrobot :이 명령은 bash내장되어 있으므로에 설명되어 man bash있습니다. 을 사용할 수도 있습니다 help history.
pabouk

2
zsh가 다음과 같이 작동하도록 구성했습니다. 각 쉘은 OWN 히스토리 (및 그 이전에 결합 된 히스토리)를 추적하고 모든 명령이 결합 된 히스토리에 추가됩니다. 이다 다른더 나은 내가 각 쉘 터미널에 대해 서로 다른 "작업 스레드"또는 "작업"을하는 경향이 있기 때문에, 항상 모든 쉘에 대한 모든 명령에 대한 역사를 다시로드보다. 그게이 차이라고 생각 -r하고 -c그냥 가지고 대 -a.
Steven Lu

정확히 무엇을 사용하고 있습니까? history -c; history -r? 나는 그것이 당신에게 더 낫다고 생각합니다. 그것은 때때로 나에게 더 좋을 것입니다. 나는 종종 하나의 일을하기 위해 여러 개의 껍질을 사용하므로 가능한 한 많은 역사를 결합하는 것을 선호합니다. 실제로 명령이 완료된 후에 만 ​​기록에 기록됩니다. 일반적으로 한 호스트에 대한 ssh 세션을 시작하고 첫 번째 호스트가 여전히 실행되는 동안 다른 호스트를 열려면 아직 기록에 작성되지 않았으므로 다시 입력해야합니다.
sup

나는 bash가 동시에 역사의 병렬 스레드를 추적하는 방법 (쉘 인스턴스별로) 기록 하는 동안 역사를 주 기록 파일에 즉시 기록 하는 방법을 알아낼만큼 오랫동안 붙어 있지 않다고 생각 합니다. Zsh를 사용하면 훨씬 쉽게 수행 할 수있을뿐만 아니라, zsh 함수를 정의하여 많은 고급 메타 데이터를 내 고안 의 향상된 기록 파일에 쓸 수 있습니다. 오히려 없어서는 안될 것이되었습니다. 어쨌든, zsh에 대한 precmd () 및 preexec () 메커니즘은 입력 된 명령을 설명하는 인수를 전송합니다. 그런 다음 파일로 전달하는 것이 쉽지 않습니다. history -a충분할 것입니다
Steven Lu

38

약 100000 개의 항목이있는 큰 히스토리 파일이 있으며 히스토리 목록을 지우고 전체 히스토리 파일을 읽고 (및를 사용 history -c하여 history -r) 프롬프트를 표시하기 전에 눈에 띄는 (0.2 초) 지연을 일으키는 변형이 있습니다. history -n히스토리 파일에서 새 행만 읽도록 사용하면 더 빠릅니다.

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND 쉘 변수이므로 내보낼 필요가 없습니다.


훌륭한! 연결이 끊어졌을 때 더 이상 히스토리가 손실되지 않습니다!
Tobia

훌륭합니다. 파일에 추가하고 파일에서 읽음으로써 여러 터미널에서 내역을 공유합니다.
wisbucky 2014

3

다른 모든 답변에 대한 참고 사항 (기본적으로 동일한 것) :

설정 PROMPT_COMMAND="history -a;$PROMPT_COMMAND".bashrc(또는 친구들은) 충분하다.

또한 history -a현재 세션에서 기록을 "스냅 샷"할 때마다 수동으로 실행할 수 있습니다 .

항상 파일에 새 행을 추가하고 겹쳐 쓰지 shopt -s histappend않기 때문에 명령 이 필요하지 않습니다 history -a. 또한 적어도 Bash 4부터는 histappend기본 동작입니다.


내 Mac 10.13.6에서는 shopt -s histappend. 없이 작동하지 않는 것 같습니다 . 또한 내가 그것을 추가했습니다~/.bash_profile
ubershmekel

아마도 시스템의 어딘가에 histappend기본 설정이므로 사용하지 않도록 설정 한 다른 설정이있을 수 있습니다. 찾을 것이지만 Mac에 액세스 할 수 없습니다.
거스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.