대화형 쉘에서 중복 명령 기록을 병합하는 방법은 무엇입니까?

대화형 쉘에서 중복 명령 기록을 병합하는 방법은 무엇입니까?

이전에 대화형 셸 세션에서 사용된 명령을 찾으려고 하면   (up arrow)다음과 같은 결과가 나타날 수 있습니다.

$ls         # 1st time push `up arrow`
$ls         # 2nd time push `up arrow`
$ls         # 3rd time push `up arrow`
$ls         # 4th time push `up arrow`
$ls         # 5th time push `up arrow`
$ls         # 6th time push `up arrow`
$make       # 7th time push `up arrow`
$make       # 8th time push `up arrow`
$make       # 9th time push `up arrow`
$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"   # Bingo!

다음과 같은 경우라면 더 좋을 것 같습니다.

$ls         # 1st time push `up arrow`
$make       # 2th time push `up arrow`
$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"   # Bingo!

중복 기록은 일반적으로 쓸모가 없기 때문입니다.

Bash에서 이 작업을 수행하려면 어떻게 해야 합니까?

답변1

ignoredupsHISTControl 변수를 설정하여 이를 수행할 수 있습니다.

HISTCONTROL="ignoredups"

선택적으로 내보내고,

export HISTCONTROL="ignoredups"

환경 변수로 만드세요. ~에서bash(1) 매뉴얼 페이지:

HISTCONTROL

    명령이 기록 목록에 저장되는 방식을 제어하는 ​​콜론으로 구분된 값 목록입니다. 값 목록에 가 포함되어 있으면 ignorespacea로 시작하는 줄공간캐릭터는 히스토리 목록에 저장되지 않습니다. 값을 사용하면 ignoredups 이전 기록 항목과 일치하는 행이 저장되지 않습니다. 의 값은 and 의 약어 ignoreboth입니다 . 값을 지정하면 행을 저장하기 전에 현재 행과 일치하는 모든 이전 행이 기록 목록에서 제거됩니다. 위 목록에 없는 값은 무시됩니다. 만약에ignorespaceignoredupserasedupsHISTCONTROL설정되지 않거나 유효한 값을 포함하지 않는 경우 쉘 파서가 읽은 모든 행은 다음 값에 따라 기록 목록에 저장됩니다. HISTIGNORE. 여러 줄 복합 명령의 두 번째 및 후속 줄은 테스트되지 않으며 값에 관계없이 기록에 추가됩니다. HISTCONTROL.

이것은 실제로정확히질문은 무엇을 요구합니까? 사용자가 ruby …, make, make, make, ls, ls, ls, 및  (별도의 연속 라인으로) 명령을 입력하면 기록 목록은 ls, , 가 됩니다 . 세 번 누르면  명령 으로 돌아갑니다  .lslsruby …makels (up arrow)ruby

답변2

@jordanm의 답변에 추가하려면 실제로 HISTControl을 사용해야 한다고 생각하지만"삭제"값.

"지워진 값으로 인해 현재 행과 일치하는 모든 이전 행이 행을 저장하기 전에 기록 목록에서 제거됩니다."

export HISTCONTROL="ignoreboth:erasedups"

~/.bashrc로그인할 때마다 실행되도록 파일에 추가하세요 .

사실 이건 이미답변됨앞으로

의견을 추가하고 싶지만 내 평판 때문에 할 수 없습니다.

답변3

~/.zshrcMacos의 경우 터미널 기록에서 명령 중복을 방지하려면 파일에 다음 줄을 추가하세요.

setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_FIND_NO_DUPS
setopt HIST_SAVE_NO_DUPS

답변4

정말 유용한 것을 찾을 수 없습니다!

시작 시 실행되는 bash 파일을 만들었지만 cron을 사용하여 예약할 수도 있습니다. .bash_history에서 중복된 콘텐츠를 제거합니다.

arrVar=()
while read -r line; do
  s=${line# } # remove leading spaces
  s=${line%% } # remove trailing spaces
  if [[ ! " ${arrVar[*]} " =~ " ${s} " ]] && [[ "$s" != history* ]] ;
  then
    arrVar+=("$s")
  fi
done < ~/.bash_history

printf "%s\n" "${arrVar[@]}" > ~/.bash_history

관련 정보