여러 Konsole에서 bash 기록 저장이 제대로 작동하지 않습니다.

여러 Konsole에서 bash 기록 저장이 제대로 작동하지 않습니다.

여러 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개를 초과한 적은 없지만 이전 명령 중 일부는 여전히 기록에서 사라지고 있습니다. 반복적으로 제공되는 명령이 많지만 예상대로 ignoredupsno 명령을 프롬프트에 추가하지 않습니다. 그러나 오래된 명령은 여전히 ​​사라지고 있습니다. 역사적으로 명령 수는 500개가 조금 넘는 수준으로 유지되었습니다.

파일이 무시되었지만 .bash_history여전히 많은 수의 중복 파일이 포함되어 있습니다.

$HISTSIZE추신 : echo의 출력과 $HISTFILESIZE둘 다입니다.=1000


업데이트: 위 항목에서 문제를 발견했습니다 .bashrc. .bash_history에 마지막 새 명령을 추가 history -a하려면 호출하세요 . PROMPT_COMMAND따라서 효과 ignoredupserasedups없습니다.

모든 터미널에서 반복하지 않고 .bash_history에 쓸 수 있는 방법이 있나요? 각 명령 프롬프트에 전체 기록을 로드 history -r하고 쓰기 저장을 다시 사용하고 싶지 않습니다 history -w. 한 터미널에서 실행한 명령이 병렬로 실행되는 다른 터미널에도 나타나기 때문입니다. 결합된 명령이 새 터미널에만 나타나기를 원합니다.

내 이력이 500으로 잘린 이유에 대한 미스터리가 풀렸다. 나는 이 컴퓨터에 SSH를 연결할 때마다 이런 일이 발생한다는 것을 알았습니다. .bash_profile다음 항목으로 항목을 생성하면 문제가 해결되었습니다.

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

이제 ssh를 할 때마다 내 .bashrc도 실행됩니다. 이제 기록 파일 크기가 단조롭게 증가합니다.

답변1

나는 새로운 명령을 직접 추가하는 동시에 중복된 명령을 제거하는 것이 불가능하다는 결론에 도달했습니다. 그래서 내 솔루션은 나중에 다음 명령을 실행하는 것이 었습니다. 아니면 내 crontab에 넣으세요.

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

위 명령은 명령의 마지막 항목을 유지하고 순서를 섞지 않고 기록 파일에서 그 위에 있는 다른 모든 중복 항목을 제거합니다.

답변2

보기 흉 sed하고 awk더 좋을 수도 있지만 다음을 추가하여 동일한 문제를 해결하려고 했습니다 .bashrc.

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

이렇게 하면 열려는 각 터미널에 대해 별도의 기록 파일이 생성되지만, bash 내에서 bash를 실행하면 동일한 기록이 사용되지만 덮어쓰면 안 됩니다. 내 경험을 바탕으로 경고하겠습니다. 이 방법은 효과가 있고 기록을 덮어쓰는 것을 방지하지만, grep찾고 있는 기록을 찾으려면 여러 파일을 사용해야 하며 , 이는 때때로 매우 시간이 많이 걸릴 수 있습니다.

관련 정보