여러 Konsole에서 bash 기록 저장이 올바르게 작동하지 않습니다


9

여러 개의 Konsole 터미널을 사용합니다. 그리고 나는 모든 터미널에 입력 한 모든 명령이 명령 기록에 저장되기를 원하므로 다음에 열리는 konsole에 모든 명령이 포함됩니다. 각 터미널이 다른 터미널의 명령 기록을 덮어 쓰지 못하게하기 위해 다음과 같이 설정했습니다..bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

프롬프트에서 명령 번호를 확인하기 위해 마지막 줄을주었습니다. 명령 번호 600을 넘지 못했지만 여전히 이전 명령 중 일부가 역사에서 사라지고 있습니다. 반복적으로 제공되는 많은 명령이 있지만에서 예상대로 ignoredups프롬프트에서 명령 no를 증가시키지 않습니다. 그러나 오래된 명령은 여전히 ​​사라지고 기록의 명령 수는 항상 500 이상으로 남아 있습니다.

.bash_history파일은 여전히 ignoredups에도 불구하고 중복을 많이 포함되어 있습니다.

PS : 에코의 출력 $HISTSIZE과는 $HISTFILESIZE모두=1000


업데이트 : 위의 항목에서 문제를 발견했습니다 .bashrc. 그냥 전화 history -aPROMPT_COMMAND간단하게 .bash_history 파일에 마지막으로 새 명령을 추가합니다. 그래서 ignoredupserasedups영향을주지 않습니다.

어떤 방법으로도 모든 터미널에서 중복없이 .bash_history에 쓸 수 있습니까? 한 터미널에서 발행 한 명령이 다른 병렬 실행 터미널에도 나타나기 때문에 각 명령 프롬프트에서 전체 기록을로드하고 history -r다시 작성하고 싶지 않습니다 history -w. 결합 된 명령이 새 터미널에만 나타나기를 원합니다.

내 역사가 500으로 줄어드는 퍼즐이 해결되었습니다. 나는이 기계에 ssh 할 때마다 발생하는 것을 알았습니다. .bash_profile다음 항목으로를 작성하면 이 문제가 해결되었습니다.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

이제 내 .bashrc는 내가 ssh 할 때마다 실행됩니다. 그리고 히스토리 파일 크기는 이제 단조 증가하고 있습니다.


이것이 당신이 무엇을하고 있습니까? unix.stackexchange.com/questions/1288/…
jasonwryan

아니요. Oli의 목록에서 두 번째 요구 사항을 피하고 싶습니다. 나는 다른 터미널의 역사가 혼동되기를 원하지 않습니다. 새 터미널을 시작할 때까지 이것은 내 컴퓨터를 올바르게 종료 할 때 자연스럽게 발생하는 것입니다. 그러나 때로는 적절한 종료가 불가능하며 즉시 기록을 저장하지 않으면 갑자기 전원이 꺼지면 모든 것이 손실됩니다.
indiajoe

사운드는 거의 비슷하게 질문에 오는 bug-bash이 질문을 게시 한 후 1 년 메일 링리스트 : lists.gnu.org/archive/html/bug-bash/2013-07/msg00092.html
구문 에러

답변:


1

중복 명령을 제거하기 위해 새 명령을 직접 추가하거나 동시에 추가 할 수 없다고 결론을 내 렸습니다. 그래서 내 해결책은 다음 명령을 잠시 실행하는 것입니다. 또는 내 crontab에 넣습니다.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

위의 명령은 명령의 마지막 발생을 유지하고 순서를 엉망으로 만들지 않고 기록 파일에서 명령의 다른 모든 반복을 제거합니다.


0

그것은 추악하고, 나는 확실 sed하거나 awk더 좋을 것이지만, 이것을 내 안에 추가하여 동일한 문제를 해결하려고했습니다 .bashrc.

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

이렇게하면 열린 각 터미널에 대해 별도의 기록 파일이 생성되지만 bash 내에서 bash를 실행하면 동일한 기록을 사용하지만 덮어 쓰지 않아야합니다. 나는 내 경험에서 경고에 경고합니다. 이 작업을 수행하고 기록을 덮어 쓰지 않도록하면서 원하는 기록을 grep찾으 려면 여러 파일 이 있어야하는데 때로는 시간이 오래 걸릴 수 있습니다.

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