여러 터미널로 배쉬 히스토리 처리


110

주로 터미네이터를 사용하며 일반적으로 3 개의 분할 터미널 창으로 열립니다. 또한 여러 가지 이유로 그놈 터미널을 사용합니다.
이 경우 bash 기록이 어떻게 처리되는지 궁금합니다.history

예를 들어, 내 프롬프트에는 현재 bash 기록 줄 ( \!)이 표시되고 3 개의 분할 터미널 창으로 Terminator를 시작하면 모든 터미널에서 동일한 기록 줄 (100)을 얻습니다. 어떤 기록이 저장됩니까?

또한 터미네이터를 사용한 후 Gnome Terminal을 시작하면 터미네이터에서 이전에 발행 된 모든 명령에 관계없이 시작시 줄 100을 얻습니다.


답변:


107

저장된 bash 세션은 가장 최근에 닫힌 터미널을위한 세션입니다. 모든 세션에 대한 명령을 저장하려면 여기에 설명 된 트릭을 사용할 수 있습니다 .

export PROMPT_COMMAND='history -a'

맨 페이지 인용 : "설정된 경우 각 기본 프롬프트를 실행하기 전에 값이 명령으로 실행됩니다."

따라서 명령이 완료 될 때마다 기록되지 않은 기록 항목이 추가 ~/.bash_history되어 프롬프트 ($ PS1 만)가 다시 표시됩니다.

그래서 그 줄을 넣은 후에 /etc/bash.bashrc나는 터미널을 게으 르기 때문에 바퀴를 재발견하거나 물건을 다시 입력하는 소중한 초를 잃을 필요가 없습니다.

어쨌든, 다른 세션의 명령이 히스토리 파일에 혼합되어 나중에 읽기가 쉽지 않다는 점을 고려해야합니다.

또한보십시오:


다른 TTL을 위해 별도로 저장되지 않습니까?
Vineet Menon

우수한. 설명과 해결책에 감사드립니다. 나는 함께 시도 export PROMPT_COMMAND='history -a; history -r'했고 터미널에 이상한 히스토리 라인 번호가 있습니다. 명령 히스토리 라인 번호를 발행 한 후 2000 년 1 대신 점프합니다. 이상하지만 말한 것처럼 동작합니다-모든 터미널 히스토리가 저장됩니다.
제타

@VineetMenon 자세한 내용은 여기 를 참조 하십시오 . 흥미로운 부분 : 쉘이 시작될 때, 히스토리는 HISTFILE 변수에 의해 명명 된 파일 (기본값`~ / .bash_history ')에서 초기화됩니다. [...] 대화식 쉘이 종료되면 마지막 $ HISTSIZE 행이 히스토리 목록에서 $ HISTFILE로 이름이 지정된 파일로 복사됩니다.
jcollado

이 웹 사이트는 다음과 같이 보입니다 : northernmost.org/blog/flush-bash_history-after-each-command
Shubham


32

의 여러 번 읽은 후에 man bash는 각 셸에 대해 별도의 기록 파일을 사용합니다. 나는 mkdir -m 0700 ~/.history그때 추가했다

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

내에 ~/.bashrc. 때때로, 나는 그것을 기억 du -sk .history하고 청소합니다. 내가 입력 한 모든 명령이 나를 위해 유지되는 것이 좋습니다.

방금 위의 내용을 사용하여 늦게 수행 한 작업을 확인했습니다.
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
또는
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(예 : sudo mount정렬 체인에 첫 번째 인수 포함 ).


3
HISTFILESIZE두 번 배정 합니까?
Daniel

2
HISTFILESIZE를 0으로 설정하여 기록 버퍼를 지우고 기록 저장 메커니즘을 재설정합니다. 그런 다음 원하는 크기를 설정하고 HISTFILE에 기록 저장을 시작합니다. 의 역사 섹션을 참조하십시오 man bash.
waltinator

1
Ctrl+r다시 작업 하기 위해 기록 파일을 병합하는 방법이 있습니까?
n611x007

3
이것은 새로운 질문이어야하지만 좋은 생각이라고 생각하지 않습니다. 내가 사용 egrep 'whatever' .history/*(또는 cat .history/* | egrep 'whatever') 대신에, 그리고 개별 세션의 검색 기록을 Ctrl 키-R을 사용합니다. man bash-builtinshistory 명령에 대해 읽으십시오 . 내 sort .history/* | uniq -c | sort -n | wc -l160160 고유 명령을 cut '-d ' -f1 .history/* | sort | uniq -c | sort -n보여 2004 2004 고유 명령, 대부분 오타를 보여줍니다. 이 모든 것을 bash의 "히스토리 목록"에로드하면 도움이되지 않습니다.
waltinator

@ waltinator-이것이 오래된 의견이라는 것을 알고 있지만 환경 변수를 설정하면 즉각적인 조치가 트리거된다는 것을 암시합니까? 로컬 쉘에서 HISTFILESIZE에 값 0을 할당 한 후 즉시 4096으로 변경한다는 사실을 알 수있는 프로세스는 무엇입니까? 이것은 bash가 특정 변수 이름을 처리하는 것에 대해 문서화되지 않은 것입니까?
동기화되지 않은

8

history모든 터미널에서 표시하려면

export PROMPT_COMMAND='history -a; history -r'.bashrc 파일에 추가 하십시오.

출처 : http://northernmost.org/blog/flush-bash_history-after-each-command



3
나는 이것을 몇 달 동안 사용한 후에 결국 최근에 이것을 언급했다고 말할 것입니다. Tmux 창에서 원래 실행 한 명령을 실행하기 위해 항상 마지막 100 개의 명령을 거르고 싶지 않기 때문에 때로는 달콤한 것입니다. 때로는 다시 시작 해야하는 전용 로그 명령이있을 수 있습니다.
Elijah Lynn

생선 껍질이 제공하는 좋은 해결책은입니다 history --merge. 나는 이것을 1 년 정도 사용해 왔으며 문제를 해결합니다. 다른 세션에서 가장 최근의 기록을 원할 때 해당 명령을 실행하면 즉시 사용할 수 있습니다.
Elijah Lynn

수출이 필요하지 않습니다.
제한 속죄

6

또 다른 대안은 " bash에 영구 히스토리 유지 "를 참조하십시오 . 그것은 지금에 입력 한 모든 명령을 보낼 수있는 프롬프트 릭 어떤 (보통 일반에 대한 한 짓을 나란히 "지속적인 역사"파일에 단자 .history).


1
나는 줄을 만들기 위해 $$ 를 삽입했습니다 echo $$ $date_part "$command_part" >> ~/.persistent_history.
Evgeni Sergeev

CTRL-R 히스토리 검색과 함께 대체 히스토리를 작성할 수 있습니까?
최대
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.